commit 2ab1b5f2f2f90ea11383c091b0b86202b7c3ca5d Author: Damian Johnson atagar@torproject.org Date: Mon Apr 4 17:11:33 2016 -0700
Revise event selector dialog
There's a couple popups left within the panels. Moving, cleaning up, and testing. --- nyx/panel/log.py | 31 ++++--------------------------- nyx/popups.py | 37 +++++++++++++++++++++++++++++++++++++ test/popups.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 27 deletions(-)
diff --git a/nyx/panel/log.py b/nyx/panel/log.py index 4582885..364878f 100644 --- a/nyx/panel/log.py +++ b/nyx/panel/log.py @@ -43,7 +43,6 @@ CONFIG = conf.config_dict('nyx', { 'features.log.prepopulateReadLimit': 5000, 'features.log.maxRefreshRate': 300, 'features.log.regex': [], - 'msg.misc.event_types': '', 'startup.events': 'N3', }, conf_handler)
@@ -142,33 +141,11 @@ class LogPanel(nyx.panel.Panel, threading.Thread): Prompts the user to select the events being listened for. """
- # allow user to enter new types of events to log - unchanged if left blank + event_types = nyx.popups.show_event_selector()
- with nyx.popups.popup_window(16, 80) as (popup, width, height): - if popup: - # displays the available flags - - popup.draw_box() - popup.addstr(0, 0, 'Event Types:', HIGHLIGHT) - event_lines = CONFIG['msg.misc.event_types'].split('\n') - - for i in range(len(event_lines)): - popup.addstr(i + 1, 1, event_lines[i][6:]) - - popup.win.refresh() - - user_input = nyx.controller.input_prompt('Events to log: ') - - if user_input: - try: - user_input = user_input.replace(' ', '') # strip spaces - event_types = nyx.arguments.expand_events(user_input) - - if event_types != self._event_types: - self._event_types = nyx.log.listen_for_events(self._register_tor_event, event_types) - self.redraw(True) - except ValueError as exc: - nyx.controller.show_message('Invalid flags: %s' % exc, HIGHLIGHT, max_wait = 2) + if event_types != self._event_types: + self._event_types = nyx.log.listen_for_events(self._register_tor_event, event_types) + self.redraw(True)
def show_snapshot_prompt(self): """ diff --git a/nyx/popups.py b/nyx/popups.py index 4bf14fe..3160949 100644 --- a/nyx/popups.py +++ b/nyx/popups.py @@ -9,12 +9,15 @@ import math import operator
import nyx +import nyx.arguments import nyx.controller import nyx.curses import nyx.panel
from nyx.curses import RED, GREEN, YELLOW, CYAN, WHITE, NORMAL, BOLD, HIGHLIGHT
+import stem.util.conf + NO_STATS_MSG = "Usage stats aren't available yet, press any key..."
HEADERS = ['Consensus:', 'Microdescriptor:', 'Server Descriptor:'] @@ -26,6 +29,10 @@ BLOCK_START, BLOCK_END = '-----BEGIN ', '-----END ' UNRESOLVED_MSG = 'No consensus data available' ERROR_MSG = 'Unable to retrieve data'
+CONFIG = stem.util.conf.config_dict('nyx', { + 'msg.misc.event_types': '', +}) +
def popup_window(height = -1, width = -1, top = 0, left = 0, below_static = True): """ @@ -308,6 +315,36 @@ def show_sort_dialog(title, options, previous_order, option_colors): return new_order
+def show_event_selector(): + """ + Presents a chart of event types we support, with a prompt for the user to + select a set. + + :returns: **list** of event types the user has selected or **None** if dialog + is canceled + """ + + def _render(subwindow): + subwindow.box() + subwindow.addstr(0, 0, 'Event Types:', HIGHLIGHT) + + for i, line in enumerate(CONFIG['msg.misc.event_types'].split('\n')): + subwindow.addstr(1, i + 1, line[6:]) + + with nyx.curses.CURSES_LOCK: + nyx.curses.draw(_render, top = _top(), width = 80, height = 16) + user_input = nyx.controller.input_prompt('Events to log: ') + + if user_input: + try: + user_input = user_input.replace(' ', '') # strip spaces + return nyx.arguments.expand_events(user_input) + except ValueError as exc: + nyx.controller.show_message('Invalid flags: %s' % exc, HIGHLIGHT, max_wait = 2) + + return None + + def show_descriptor(fingerprint, color, is_close_key): """ Provides a dialog showing descriptors for a relay. diff --git a/test/popups.py b/test/popups.py index 2a308f0..e34398b 100644 --- a/test/popups.py +++ b/test/popups.py @@ -90,6 +90,25 @@ Config Option Ordering:--------------------------------------------------------+ +------------------------------------------------------------------------------+ """.strip()
+EXPECTED_EVENT_SELECTOR = """ +Event Types:-------------------------------------------------------------------+ +| d DEBUG a ADDRMAP r CLIENTS_SEEN C SIGNAL | +| i INFO f AUTHDIR_NEWDESCS u DESCCHANGED F STREAM_BW | +| n NOTICE j BUILDTIMEOUT_SET g GUARD G STATUS_CLIENT | +| w WARN b BW h HS_DESC H STATUS_GENERAL | +| e ERR k CELL_STATS v HS_DESC_CONTENT I STATUS_SERVER | +| c CIRC x NETWORK_LIVENESS s STREAM | +| l CIRC_BW y NEWCONSENSUS J TB_EMPTY | +| m CIRC_MINOR z NEWDESC t TRANSPORT_LAUNCHED | +| p CONF_CHANGED B NS | +| q CONN_BW o ORCONN | +| | +| DINWE tor runlevel+ A All Events | +| 12345 nyx runlevel+ X No Events | +| U Unknown Events | ++------------------------------------------------------------------------------+ +""".strip() + EXPECTED_DESCRIPTOR_WITHOUT_FINGERPRINT = """ Consensus Descriptor:----------+ | No consensus data available | @@ -253,6 +272,20 @@ class TestPopups(unittest.TestCase): self.assertEqual(['Name', 'Summary', 'Description'], rendered.return_value)
@patch('nyx.popups._top', Mock(return_value = 0)) + @patch('nyx.controller.input_prompt', Mock(return_value = None)) + def test_event_selector_when_canceled(self): + rendered = test.render(nyx.popups.show_event_selector) + self.assertEqual(EXPECTED_EVENT_SELECTOR, rendered.content) + self.assertEqual(None, rendered.return_value) + + @patch('nyx.popups._top', Mock(return_value = 0)) + @patch('nyx.controller.input_prompt', Mock(return_value = '2bwe')) + def test_event_selector_with_input(self): + rendered = test.render(nyx.popups.show_event_selector) + self.assertEqual(EXPECTED_EVENT_SELECTOR, rendered.content) + self.assertEqual(set(['NYX_INFO', 'ERR', 'WARN', 'BW', 'NYX_ERR', 'NYX_WARN', 'NYX_NOTICE']), rendered.return_value) + + @patch('nyx.popups._top', Mock(return_value = 0)) def test_descriptor_without_fingerprint(self): rendered = test.render(nyx.popups.show_descriptor, None, nyx.curses.Color.RED, lambda key: key.match('esc')) self.assertEqual(EXPECTED_DESCRIPTOR_WITHOUT_FINGERPRINT, rendered.content)
tor-commits@lists.torproject.org