Merge lp://staging/~jelmer/tribunal/unreloadable into lp://staging/~mbp/tribunal/view-subunit-broken

Proposed by Jelmer Vernooij
Status: Merged
Merged at revision: not available
Proposed branch: lp://staging/~jelmer/tribunal/unreloadable
Merge into: lp://staging/~mbp/tribunal/view-subunit-broken
Diff against target: 124 lines (+55/-13)
1 file modified
bin/tribunal-subunit (+55/-13)
To merge this branch: bzr merge lp://staging/~jelmer/tribunal/unreloadable
Reviewer Review Type Date Requested Status
Martin Pool Approve
Jonathan Lange Pending
Review via email: mp+18009@code.staging.launchpad.net
To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) wrote :

This makes the handling of unseekable streams (such as stdin) a bit friendlier.

Revision history for this message
Martin Pool (mbp) wrote :

I don't think I really like the gui defaulting to reading stdin, because it will look to users like it's just hung. But we can fix that separately; I realize you're just building on Robert's change there. The message is ok.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'bin/tribunal-subunit'
--- bin/tribunal-subunit 2010-01-25 15:31:21 +0000
+++ bin/tribunal-subunit 2010-01-25 16:23:16 +0000
@@ -16,16 +16,17 @@
16except ImportError:16except ImportError:
17 pass17 pass
1818
19from pprint import pformat19import errno
20import sys20import sys
2121
22import gtk22import gtk
23import pango23import pango
2424
25from testtools import (25try:
26 MultiTestResult,26 import testrepository.repository.file
27 TestResult,27except ImportError:
28 )28 testrepository = None
29
29from subunit import TestProtocolServer30from subunit import TestProtocolServer
30from subunit.test_results import TestResultFilter31from subunit.test_results import TestResultFilter
3132
@@ -35,7 +36,6 @@
35from tribunal.eventloop import GtkLoop36from tribunal.eventloop import GtkLoop
36from tribunal.view import (37from tribunal.view import (
37 load_glade,38 load_glade,
38 TribunalWindow,
39 )39 )
4040
4141
@@ -96,6 +96,10 @@
96 pass96 pass
9797
9898
99class UnreloadableStream(Exception):
100 """The test stream can not be reloaded (probably because it is a pipe)."""
101
102
99class SubunitWindow(object):103class SubunitWindow(object):
100 """Per-window application logic.104 """Per-window application logic.
101105
@@ -209,26 +213,49 @@
209213
210 def on_filter_failed_menuitem_toggled(self, menuitem):214 def on_filter_failed_menuitem_toggled(self, menuitem):
211 self._show_failed = menuitem.active215 self._show_failed = menuitem.active
212 self.reload_stream()216 try:
217 self.reload_stream()
218 except UnreloadableStream:
219 pass
213220
214 def on_filter_skipped_menuitem_toggled(self, menuitem):221 def on_filter_skipped_menuitem_toggled(self, menuitem):
215 self._show_skipped = menuitem.active222 self._show_skipped = menuitem.active
216 self.reload_stream()223 try:
224 self.reload_stream()
225 except UnreloadableStream:
226 pass
217227
218 def on_filter_success_menuitem_toggled(self, menuitem):228 def on_filter_success_menuitem_toggled(self, menuitem):
219 self._show_success = menuitem.active229 self._show_success = menuitem.active
220 self.reload_stream()230 try:
231 self.reload_stream()
232 except UnreloadableStream:
233 pass
221234
222 def on_reload_button_clicked(self, reload_button):235 def on_reload_button_clicked(self, reload_button):
223 self.reload_stream()236 try:
237 self.reload_stream()
238 except UnreloadableStream:
239 dialog = gtk.Dialog(title="Stream not reloadable",
240 parent=self.subunit_window,
241 buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
242 label = gtk.Label("This stream is not reloadable. Perhaps it is a pipe?")
243 dialog.vbox.pack_start(label, True, True, 0)
244 label.show()
245 dialog.run()
246 dialog.destroy()
224247
225 def show_all(self):248 def show_all(self):
226 # show the top level window and the rest will follow249 # show the top level window and the rest will follow
227 self.subunit_window.show_all()250 self.subunit_window.show_all()
228 251
229 def reload_stream(self):252 def reload_stream(self):
230 self._last_input_file.seek(0)253 try:
231 self.load_from_subunit_stream(self._last_input_file)254 self._last_input_file.seek(0)
255 except IOError, errno.ESPIPE:
256 raise UnreloadableStream()
257 else:
258 self.load_from_subunit_stream(self._last_input_file)
232259
233260
234class ViewSubunitApp(object):261class ViewSubunitApp(object):
@@ -257,7 +284,22 @@
257 glade_xml.signal_autoconnect(self)284 glade_xml.signal_autoconnect(self)
258285
259 self._window.show_all()286 self._window.show_all()
260 self._window.load_from_subunit_stream(file(argv[1], 'rt'))287 if len(argv) < 2:
288 stream = None
289 # Try for testrepository source
290 if testrepository is not None:
291 factory = testrepository.repository.file.RepositoryFactory()
292 try:
293 repo = factory.open('.')
294 except IOError:
295 stream = None
296 else:
297 stream = repo.get_test_run(repo.latest_id()).get_subunit_stream()
298 if stream is None:
299 stream = sys.stdin
300 else:
301 stream = file(argv[1], 'rb')
302 self._window.load_from_subunit_stream(stream)
261303
262 self._event_loop.start()304 self._event_loop.start()
263305

Subscribers

People subscribed via source and target branches

to all changes: