def __init__(self, screen, plotboss, name="My Form"): super(PlotJobFrame, self).__init__(screen, screen.height, screen.width, has_border=False, name=name) # Internal state required for doing periodic updates self._last_frame = 0 self._reverse = True self.plotboss = plotboss # Create the basic form layout... layout = Layout([1], fill_frame=False) self._header = TextBox(4, as_string=True) self._header.disabled = True self._header.custom_colour = "label" self._list = MultiColumnListBox( 11, #Widget.FILL_FRAME, ["<6", ">12", ">12", "<40", ">8", ">8", ">10", "<32", "100%"], [], titles=[ "INDEX", "JOB_ID", "PLOT_ID", "TMP_DIR", "PID", "PHASE", "ELAPSED", "PROGRESS", "FINAL_DIR" ], name="mc_list", parser=AsciimaticsParser()) self._drive_list = MultiColumnListBox( Widget.FILL_FRAME, ["<40", ">12", ">10", ">10", "<32", "<10"], [], titles=["DRIVE", "TEMP/FINAL", "TOTAL", "FREE", "USAGE", "JOBS"], name="drive_list", parser=AsciimaticsParser()) self._completed_info = TextBox(4, as_string=True) self._completed_info.disabled = True self._sys_info = TextBox(4, as_string=True) self._sys_info.disabled = True self.add_layout(layout) layout2 = Layout([1], fill_frame=True) self.add_layout(layout2) layout.add_widget(self._header) layout.add_widget(self._list) layout2.add_widget(self._drive_list) layout2.add_widget(self._completed_info) layout2.add_widget(self._sys_info) layout2.add_widget(Label("Press `r` to toggle order, or `q` to quit.")) self.fix() # Add my own colour palette self.palette = defaultdict(lambda: (Screen.COLOUR_WHITE, Screen. A_NORMAL, Screen.COLOUR_BLACK)) for key in ["selected_focus_field", "label"]: self.palette[key] = (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK) self.palette["title"] = (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_WHITE)
def test_asciimatics_parser(self): """ Check AsciimaticsParser works as expected. """ parser = AsciimaticsParser() tokens = parser.parse("a${1}b${2,1}c${3,2,4}de", None) self.assertEquals(next(tokens), ("a", (None, None, None), 0)) self.assertEquals(next(tokens), ("b", (1, 0, None), 1)) self.assertEquals(next(tokens), ("c", (2, 1, None), 6)) self.assertEquals(next(tokens), ("d", (3, 2, 4), 13)) self.assertEquals(next(tokens), ("e", (3, 2, 4), 22)) with self.assertRaises(StopIteration): next(tokens)
def test_asciimatics_parser(self): """ Check AsciimaticsParser works as expected. """ parser = AsciimaticsParser() parser.reset("a${1}b${2,1}c${3,2,4}de${7}", None) tokens = parser.parse() self.assertEquals(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) self.assertEquals(next(tokens), (1, Parser.CHANGE_COLOURS, (1, 0, None))) self.assertEquals(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) self.assertEquals(next(tokens), (6, Parser.CHANGE_COLOURS, (2, 1, None))) self.assertEquals(next(tokens), (6, Parser.DISPLAY_TEXT, "c")) self.assertEquals(next(tokens), (13, Parser.CHANGE_COLOURS, (3, 2, 4))) self.assertEquals(next(tokens), (13, Parser.DISPLAY_TEXT, "d")) self.assertEquals(next(tokens), (22, Parser.DISPLAY_TEXT, "e")) self.assertEquals(next(tokens), (23, Parser.CHANGE_COLOURS, (7, 0, None))) with self.assertRaises(StopIteration): next(tokens)
def __init__(self, screen, order_book: LocalOrderBook): super(OrderBookFrame, self).__init__(screen, screen.height, screen.width, has_border=False, name="Order Book") # Internal state required for doing periodic updates self._last_frame = 0 self._ob = order_book self._level = screen.height // 2 - 1 # Create the basic form layout... layout = Layout([1], fill_frame=True) self._header = TextBox(1, as_string=True) self._header.disabled = True self._header.custom_colour = "label" self._asks = MultiColumnListBox(screen.height // 2, ["<25%", "<25%", "<25%"], [], titles=["Level", "Price", "Amount"], name="ask_book", parser=AsciimaticsParser()) self._bids = MultiColumnListBox(screen.height // 2, ["<25%", "<25%", "<25%"], [], titles=["Level", "Price", "Amount"], name="bid_book", parser=AsciimaticsParser()) self.add_layout(layout) layout.add_widget(self._header) layout.add_widget(self._asks) layout.add_widget(self._bids) self.fix() # Add my own colour palette self.palette = defaultdict(lambda: (Screen.COLOUR_WHITE, Screen. A_NORMAL, Screen.COLOUR_BLACK)) for key in ["selected_focus_field", "label"]: self.palette[key] = (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK) self.palette["title"] = (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_WHITE)
def draw(self) -> None: layout = Layout([100]) self.add_layout(layout) self.recap_text_box = TextBox(1, parser=AsciimaticsParser()) self.recap_text_box.disabled = True layout.add_widget(self.recap_text_box) layout.add_widget(Divider()) self.run_name_widget = Text(name=RUN_NAME_KEY, label=RecapForm.RUN_NAME) self.run_name_widget.value = "" layout.add_widget(self.run_name_widget) self.fix()
def __init__(self, screen): super(DemoFrame, self).__init__(screen, screen.height, screen.width, has_border=False, name="My Form") # Internal state required for doing periodic updates self._last_frame = 0 self._sort = 5 self._reverse = True # Create the basic form layout... layout = Layout([1], fill_frame=True) self._header = TextBox(1, as_string=True) self._header.disabled = True self._header.custom_colour = "label" self._list = MultiColumnListBox( Widget.FILL_FRAME, [">6", 10, ">4", ">7", ">7", ">5", ">5", "100%"], [], titles=["PID", "USER", "NI", "VIRT", "RSS", "CPU%", "MEM%", "CMD"], name="mc_list", parser=AsciimaticsParser()) self.add_layout(layout) layout.add_widget(self._header) layout.add_widget(self._list) layout.add_widget( Label( "Press `<`/`>` to change sort, `r` to toggle order, or `q` to quit." )) self.fix() # Add my own colour palette self.palette = defaultdict(lambda: (Screen.COLOUR_WHITE, Screen. A_NORMAL, Screen.COLOUR_BLACK)) for key in ["selected_focus_field", "label"]: self.palette[key] = (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK) self.palette["title"] = (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_WHITE)
def __init__(self, screen): super(DemoFrame, self).__init__(screen, int(screen.height * 2 // 3), int(screen.width * 2 // 3), data=form_data, has_shadow=True, name="My Form") layout = Layout([1, 18, 1]) self.add_layout(layout) self._reset_button = Button("Reset", self._reset) layout.add_widget(Label("Group 1:"), 1) layout.add_widget( TextBox(5, label="My First Box:", name="TA", parser=AsciimaticsParser(), line_wrap=True, on_change=self._on_change), 1) layout.add_widget( Text(label="Alpha:", name="TB", on_change=self._on_change, validator="^[a-zA-Z]*$"), 1) layout.add_widget( Text(label="Number:", name="TC", on_change=self._on_change, validator="^[0-9]*$", max_length=4), 1) layout.add_widget( Text(label="Email:", name="TD", on_change=self._on_change, validator=self._check_email), 1) layout.add_widget(Text(label="Readonly:", name="RO", readonly=True), 1) layout.add_widget(Divider(height=2), 1) layout.add_widget(Label("Group 2:"), 1) layout.add_widget( RadioButtons([("Option 1", 1), ("Option 2", 2), ("Option 3", 3)], label="A Longer Selection:", name="Things", on_change=self._on_change), 1) layout.add_widget( CheckBox("Field 1", label="A very silly long name for fields:", name="CA", on_change=self._on_change), 1) layout.add_widget( CheckBox("Field 2", name="CB", on_change=self._on_change), 1) layout.add_widget( CheckBox("Field 3", name="CC", on_change=self._on_change), 1) layout.add_widget( DatePicker("Date", name="DATE", year_range=range(1999, 2100), on_change=self._on_change), 1) layout.add_widget( TimePicker("Time", name="TIME", on_change=self._on_change, seconds=True), 1) layout.add_widget( Text("Password", name="PWD", on_change=self._on_change, hide_char="*"), 1) layout.add_widget( DropdownList([ ("Item 1", 1), ("Item 2", 2), ("Item 3", 3), ("Item 3", 4), ("Item 3", 5), ("Item 3", 6), ("Item 3", 7), ("Item 3", 8), ("Item 3", 9), ("Item 3", 10), ("Item 3", 11), ("Item 3", 12), ("Item 3", 13), ("Item 3", 14), ("Item 3", 15), ("Item 3", 16), ("Item 4", 17), ("Item 5", 18), ], label="Dropdown", name="DD", on_change=self._on_change), 1) layout.add_widget(Divider(height=3), 1) layout2 = Layout([1, 1, 1]) self.add_layout(layout2) layout2.add_widget(self._reset_button, 0) layout2.add_widget(Button("View Data", self._view), 1) layout2.add_widget(Button("Quit", self._quit), 2) self.fix()
def test_coloured_text(self): """ Check ColouredText works as expected. """ # No specified start colour ct = ColouredText("Some ${1}text", AsciimaticsParser()) self.assertEquals(str(ct), "Some text") self.assertEquals(ct.raw_text, "Some ${1}text") self.assertEquals(len(ct), 9) self.assertEquals(ct.first_colour, None) self.assertEquals(ct.last_colour, (1, 0, None)) self.assertEquals(ct.colour_map[0], (None, None, None)) # Specified start colour ct = ColouredText("Some ${1}text", AsciimaticsParser(), colour=(2, 1, 0)) self.assertEquals(str(ct), "Some text") self.assertEquals(ct.raw_text, "Some ${1}text") self.assertEquals(len(ct), 9) self.assertEquals(ct.first_colour, (2, 1, 0)) self.assertEquals(ct.last_colour, (1, 0, None)) self.assertEquals(ct.colour_map[0], (2, 1, 0)) # Slicing self.assertEquals(ct[0], ColouredText("S", AsciimaticsParser())) self.assertEquals(ct[1:-1], ColouredText("ome ${1}tex", AsciimaticsParser())) self.assertNotEquals(ct[1:-1], ColouredText("ome tex", AsciimaticsParser())) self.assertEquals(ct[100:101], ColouredText("", AsciimaticsParser())) # Adding self.assertEquals( ColouredText("Some ", AsciimaticsParser()) + ColouredText("${3}Text", AsciimaticsParser()), ColouredText("Some ${3}Text", AsciimaticsParser())) # Joining self.assertEquals( ColouredText(" ", AsciimaticsParser()).join([ ColouredText("Hello", AsciimaticsParser()), ColouredText("${3}World", AsciimaticsParser()) ]), ColouredText("Hello ${3}World", AsciimaticsParser())) # Bad data comparisons self.assertNotEquals(ct, 1) self.assertFalse(ct == "Some text") # Startswith self.assertTrue(ct.startswith("Some"))
def __init__(self, screen, worker_info_manager: WorkerInfoManager): super(WorkerInfoScene, self).__init__(screen, screen.height, screen.width, title='Worker Info', reduce_cpu=False) self._last_frame = 0 self._model = worker_info_manager self._model._refresh() self.data = {'updated_at': str(dt.now())} self.palette = PALETTE rollup_layout = Layout([100]) self.add_layout(rollup_layout) self.rollup_widget = MultiColumnListBox(round(screen.height * .05), ['12%'] * 8, [], titles=[ 'Worker Count', 'Average CPU', 'Average Memory', 'Total Fds', 'Total Executing', 'Total In Mem', 'Total Ready', 'Total In Flight', ], parser=AsciimaticsParser()) rollup_layout.add_widget(self.rollup_widget) div_layout = Layout([100]) self.add_layout(div_layout) div_layout.add_widget(Divider()) column_layout = Layout([100]) self.add_layout(column_layout) self.worker_widget = MultiColumnListBox( round(screen.height * .95), [ '20%', '10%', '20%', '10%', '10%', '10%', '10%', '10%', ], [], titles=[ 'Worker Address', 'CPU', 'Memory', 'File Descriptors', 'Executing', 'In Memory', 'Ready', 'In Flight', ], parser=AsciimaticsParser(), ) column_layout.add_widget(self.worker_widget) self.fix()