Bladeren bron

fix more lint

Daniel Sheffield 1 jaar geleden
bovenliggende
commit
e0048a0e23

+ 1 - 3
app/activities/NewProduct.py

@@ -81,9 +81,7 @@ class NewProduct(WidgetPlaceholder):
 
     @property
     def data(self):
-        return dict([
-            (k,v.get_edit_text()) for k,v in self.fields.items()
-        ])
+        return { k:v.get_edit_text() for k,v in self.fields.items() }
 
     @data.setter
     def data(self, _data):

+ 7 - 10
app/activities/PriceCheck.py

@@ -4,7 +4,6 @@
 # All rights reserved
 #
 # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
-import itertools
 from decimal import Decimal, InvalidOperation
 from itertools import chain
 from urwid import (
@@ -45,7 +44,7 @@ class PriceCheck(FocusWidget):
 
     def keypress(self, size, key):
         if isinstance(key, tuple):
-            return
+            return None
 
         if getattr(self._w.original_widget, 'original_widget', None) is None:
             return super().keypress(size, key)
@@ -56,6 +55,7 @@ class PriceCheck(FocusWidget):
             self.advance_focus(reverse=True)
         else:
             return super().keypress(size, key)
+        return None
 
     def apply_choice(self, name, value):
         self.apply_changes(name, value)
@@ -83,7 +83,7 @@ class PriceCheck(FocusWidget):
 
     @property
     def data(self):
-        ret = dict(itertools.chain(
+        ret = dict(chain(
             [(k, v.get_edit_text()) for k,v in self.edit_fields.items()],
             [(k, v.state) for k,v in self.checkboxes.items()]
         ))
@@ -127,12 +127,12 @@ class PriceCheck(FocusWidget):
         assert len(data['avg'].unique()) == 1
         norm = [ (x,) for x in data['$/unit'] ] #.to_records(index=False)
         self.graph.set_data(norm, data_max,
-            vscale=[x for x in map(float, [
+            vscale=list(map(float, [
                 data['$/unit'].min(),
                 data['$/unit'].median(),
                 data['avg'].iloc[0],
                 data_max
-            ])]
+            ]))
         )
         #self.graph.set_bar_width(1)
         # canvas_width = 10 + pad + pad + 10
@@ -209,7 +209,6 @@ class PriceCheck(FocusWidget):
           lambda x: x[0] in ('spread','rating','marker'),
           self.text_fields.items()
         )))
-        top_pane = [ 'clear', 'exit', ['sort_price', 'sort_date'], ]
 
         left_pane = [
             'product',
@@ -225,7 +224,6 @@ class PriceCheck(FocusWidget):
             'quantity',
             'price',
         ]
-        bottom_pane = [ 'graph', 'dbview', ]
 
         self.query_manager = query_manager
         self.organic_checkbox = self.checkboxes['organic']
@@ -259,11 +257,10 @@ class PriceCheck(FocusWidget):
         ])
         banner = AttrMap(banner, 'banner')
 
-        _widgets = dict(itertools.chain(*[
-            [(k, v) for k,v in x] for x in map(lambda x: x.items(), [
+        _widgets = dict(chain(*list(map(lambda x: x.items(), [
                 self.edit_fields, self.text_fields, self.checkboxes
             ])
-        ]))
+        )))
 
         _widgets.update([
             (k, LineBox(AttrMap(

+ 23 - 19
app/activities/RecipeEditor.py

@@ -5,11 +5,12 @@
 #
 # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
 from xml.etree.ElementTree import fromstring, ParseError
-from markdown import markdown
-from itertools import chain, product
 from decimal import Decimal, InvalidOperation
+from itertools import chain, product
 from collections import OrderedDict
 from typing import List, Tuple, Union, Iterable, Callable
+from markdown import markdown
+
 from urwid import (
     connect_signal,
     AttrMap,
@@ -25,6 +26,8 @@ from urwid import (
     Text,
 )
 from urwid.numedit import FloatEdit
+import yaml
+from yaml.representer import SafeRepresenter
 
 from .. import COPYRIGHT
 from ..widgets import (
@@ -35,7 +38,7 @@ from ..widgets import (
 )
 from ..data.QueryManager import QueryManager
 from .ActivityManager import ActivityManager, show_or_exit
-import yaml
+
 def change_style(style, representer):
     def new_representer(dumper, data):
         scalar = representer(dumper, data)
@@ -43,11 +46,11 @@ def change_style(style, representer):
         return scalar
     return new_representer
 
-import yaml
-from yaml.representer import SafeRepresenter
-class folded_str(str): pass
+class folded_str(str):
+    pass
 
-class literal_str(str): pass
+class literal_str(str):
+    pass
 
 # represent_str does handle some corner cases, so use that
 # instead of calling represent_scalar directly
@@ -90,13 +93,13 @@ def in_same_row(name):
         _, row = name.split('#', 1)
     return lambda x: x[0][1] == int(row)
 
-def unzip(iter: List[Tuple[AutoCompleteEdit, FloatEdit, AutoCompleteEdit]]) -> Tuple[
+def unzip(_iter: List[Tuple[AutoCompleteEdit, FloatEdit, AutoCompleteEdit]]) -> Tuple[
     List[AutoCompleteEdit], List[FloatEdit], List[AutoCompleteEdit]
 ]:
-    return zip(*iter)
+    return zip(*_iter)
 
 def extract_values(x: Union[List[AutoCompleteEdit], List[FloatEdit]]) -> Iterable[str]:
-    if isinstance(x, list) or isinstance(x, tuple):
+    if isinstance(x, (list, tuple)):
         if len(x) == 0:
             return []
         return ( v.get_edit_text() for v in x )
@@ -108,7 +111,7 @@ def to_named_value(name: str) -> Callable[[str], Tuple[str,str]]:
 def blank_ingredients_row(idx: int) -> Tuple[AutoCompleteEdit, FloatEdit, AutoCompleteEdit]:
     return (
         AutoCompleteEdit(('bg', f'product#{idx}')),
-        FloatEdit(('bg', f'')),
+        FloatEdit(('bg', '')),
         AutoCompleteEdit(('bg', f'unit#{idx}'))
     )
 
@@ -116,7 +119,7 @@ class RecipeEditor(FocusWidget):
 
     def keypress(self, size, key):
         if isinstance(key, tuple):
-            return
+            return None
 
         if getattr(self._w.original_widget, 'original_widget', None) is None:
             return super().keypress(size, key)
@@ -134,7 +137,8 @@ class RecipeEditor(FocusWidget):
         else:
             if _p.keypress((size[0],) if getattr(_p, 'contents', None) is None else size, key):
                 return super().keypress(size, key)
-            return
+            return None
+        return None
 
     def apply_choice(self, name, value):
         self.apply_changes(name, value)
@@ -248,7 +252,7 @@ class RecipeEditor(FocusWidget):
         self.components['middle_pane'][1].original_widget.contents = list(m.original_widget.contents)
         self.components['right_pane'].original_widget.contents = list(r.original_widget.contents)
         self.components['gutter'][1].contents = list(gutter.contents)
-        for idx, widget in enumerate(self.ingredients):
+        for widget in self.ingredients:
             connect_signal(widget[0], 'postchange', lambda w,_: self.update(w))
             connect_signal(widget[0], 'apply', lambda w, name: self.autocomplete_callback(
                 w, self.autocomplete_options(name, dict(map(
@@ -267,7 +271,7 @@ class RecipeEditor(FocusWidget):
 
     def save(self):
         yml = dict()
-        yml['ingredients'] = list(map(lambda x: ' '.join(x), filter(
+        yml['ingredients'] = list(map(' '.join, filter(
             lambda x: None not in map(lambda x: x or None, x), [
                 list(map(lambda x: x.get_edit_text(), x)) for x in self.ingredients
         ])))
@@ -398,7 +402,7 @@ class RecipeEditor(FocusWidget):
                 self.notices[product] = set()
             self.notices[ingredient].add(f"Ingredient '{ingredient}' is not used")
         if len(set(ingredients)) != len(ingredients):
-            self.notices[None].add(f"Some ingredients listed more than once")
+            self.notices[None].add("Some ingredients listed more than once")
 
         self.notice.set_text('\n'.join(sorted(filter(lambda x: x, [
             '\n'.join(sorted(v)) for v in self.notices.values()
@@ -435,7 +439,7 @@ class RecipeEditor(FocusWidget):
         self.ingredients: List[Tuple[AutoCompleteEdit, FloatEdit, AutoCompleteEdit]] = [
             (
                 AutoCompleteEdit(('bg', f'product#{idx}'), edit_text=ingredient[0]),
-                FloatEdit(('bg', f''), default=ingredient[1]),
+                FloatEdit(('bg', ''), default=ingredient[1]),
                 AutoCompleteEdit(('bg', f'unit#{idx}'), edit_text=ingredient[2]),
             ) for idx, ingredient in enumerate(recipe['ingredients'])
         ]
@@ -445,11 +449,11 @@ class RecipeEditor(FocusWidget):
         self.feeds = Decimal(recipe['feeds'])
         self.price = Text('')
         self.notice = Text('')
-        feeds = FloatEdit(f'Serves: ', self.feeds)
+        feeds = FloatEdit('Serves: ', self.feeds)
 
         bottom_pane = [
             self.organic,
-            LineBox(self.instructions, title=f'Instructions'),
+            LineBox(self.instructions, title='Instructions'),
             feeds,
             Columns([('weight', 2, self.price), *[(9, w) for _,w in self.price_as.items()], Divider()]),
             LineBox(self.notice, title='Errors', title_align='left'),

+ 22 - 23
app/activities/TransactionEditor.py

@@ -4,9 +4,6 @@
 # All rights reserved
 #
 # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
-import itertools
-from dateutil.parser import parse as parse_time
-from dateutil.parser._parser import ParserError
 from decimal import Decimal, InvalidOperation
 from itertools import chain
 from typing import (
@@ -16,6 +13,9 @@ from typing import (
     List,
     Iterable,
 )
+from dateutil.parser import parse as parse_time
+from dateutil.parser._parser import ParserError
+
 from urwid import (
     connect_signal,
     AttrMap,
@@ -69,7 +69,7 @@ def unzip(_iter: List[Tuple[AutoCompleteEdit, Edit]]) -> Tuple[
     return zip(*_iter)
 
 def extract_values(x: Union[List[AutoCompleteEdit], List[Edit]]) -> Iterable[str]:
-    if isinstance(x, list) or isinstance(x, tuple):
+    if isinstance(x, (list, tuple)):
         if len(x) == 0:
             return []
         return ( v.get_edit_text() for v in x )
@@ -80,7 +80,7 @@ def to_named_value(name: str) -> Callable[[str], Tuple[str,str]]:
 
 def blank_tags_row(idx: int) -> Tuple[AutoCompleteEdit, Edit]:
     return (
-        AutoCompleteEdit(('bg',f'tags#{idx}')), Edit(('bg', f'')),
+        AutoCompleteEdit(('bg',f'tags#{idx}')), Edit(('bg', '')),
     )
 
 
@@ -88,7 +88,7 @@ class TransactionEditor(FocusWidget):
 
     def keypress(self, size, key):
         if isinstance(key, tuple):
-            return
+            return None
 
         if getattr(self._w.original_widget, 'original_widget', None) is None:
             return super().keypress(size, key)
@@ -108,6 +108,7 @@ class TransactionEditor(FocusWidget):
             self.focus_on(self.edit_fields['product'])
         else:
             return super().keypress(size, key)
+        return None
 
     def apply_choice(self, name, value):
         self.apply_changes(name, value)
@@ -144,7 +145,7 @@ class TransactionEditor(FocusWidget):
             #['tags', 'descriptions'],
             map(extract_values, unzip(self._tags)),
         )
-        ret = dict(itertools.chain(
+        ret = dict(chain(
             *[ map(to_named_value(n), enumerate(l)) for n,l in zipped ],
             [(k, v.get_edit_text()) for k,v in self.edit_fields.items()],
             [(k, v.state) for k,v in self.checkboxes.items()]
@@ -184,9 +185,7 @@ class TransactionEditor(FocusWidget):
         #    title_align='left'
         #)
         gutter = Pile([
-            *[ Divider() for _ in itertools.product(
-                range(1), self._tags[:-1]
-            )],
+            *[ Divider() for _ in self._tags[:-1] ],
             Divider(),
             Divider(),
             self.buttons['add'],
@@ -202,8 +201,8 @@ class TransactionEditor(FocusWidget):
         #self.components['tags'][1].original_widget.contents = list(_tags.original_widget.contents)
         self.components['tags'].contents = list(_tags.contents)
         self.components['gutter'][1].contents = list(gutter.contents)
-        for idx, widget in enumerate(self._tags):
-            connect_signal(widget[0], 'postchange', lambda w,_: self.update())
+        for widget in self._tags:
+            connect_signal(widget[0], 'postchange', lambda *_: self.update())
             connect_signal(widget[0], 'apply', lambda w, name: self.autocomplete_callback(
                 w, name, self.autocomplete_options(name, dict(map(
                     to_unnumbered_field,
@@ -230,7 +229,7 @@ class TransactionEditor(FocusWidget):
         self.graph.set_data([],0)
         return self.update()
 
-    def update(self, w=None):
+    def update(self):
         data = self.data
         date, store = data['ts'], data['store']
         try:
@@ -261,12 +260,12 @@ class TransactionEditor(FocusWidget):
         assert len(data['avg'].unique()) == 1
         norm = [ (x,) for x in data['$/unit'] ] #.to_records(index=False)
         self.graph.set_data(norm, data_max,
-            vscale=[x for x in map(float, [
+            vscale=list(map(float, [
                 data['$/unit'].min(),
                 data['$/unit'].median(),
                 data['avg'].iloc[0],
                 data_max
-            ])]
+            ]))
         )
         #self.graph.set_bar_width(1)
         # canvas_width = 10 + pad + pad + 10
@@ -409,11 +408,10 @@ class TransactionEditor(FocusWidget):
             'marker',
         ]
         #self.clear()
-        _widgets = dict(itertools.chain(*[
-            [(k, v) for k,v in x] for x in map(lambda x: x.items(), [
+        _widgets = dict(chain(*list(map(lambda x: x.items(), [
                 self.edit_fields, self.text_fields, self.checkboxes
             ])
-        ]))
+        )))
         _widgets.update({
             'dbview': LineBox(
                 AttrMap(self.text_fields['dbview'], 'streak'),
@@ -433,15 +431,16 @@ class TransactionEditor(FocusWidget):
                 ))))
             ))
 
-        _widgets.update(dict([
-            (k, LineBox(
+        _widgets.update({
+            k: LineBox(
                 AttrMap(AutoCompletePopUp(
                     self.edit_fields[k],
                     self.apply_choice,
                     lambda: activity_manager.show(self.update())
-                ), 'streak'), title=k.title(), title_align='left')
+                ), 'streak'),
+                title=k.title(), title_align='left'
             ) for k in self.edit_fields if k != 'product'
-        ]))
+        })
         header = Text(u'Fill Transaction', 'center')
         _copyright = Text(COPYRIGHT, 'center')
 
@@ -518,7 +517,7 @@ class TransactionEditor(FocusWidget):
                 self.components['side_pane'],
                 (18,LineBox(
                     self.components['tags'],
-                    title=f'Tags',
+                    title='Tags',
                     title_align='left'
                 )),
                 self.components['gutter'],

+ 8 - 7
app/data/QueryManager.py

@@ -4,13 +4,15 @@
 # All rights reserved
 #
 # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
+import time
+from typing import Any, Callable
 from psycopg import Cursor
 from psycopg.sql import (
     SQL,
     Literal,
 )
-import time
-from typing import Any, Callable
+from dateutil.parser import parse as parse_time
+import pandas as pd
 from .TransactionView import (
     get_table_statement,
     get_transactions_statement,
@@ -20,8 +22,7 @@ from .TransactionView import (
 from .PriceView import(
     get_historic_prices_statement,
 )
-from dateutil.parser import parse as parse_time
-import pandas as pd
+
 display_map = {
     'ts': lambda x: f"{time.strftime('%Y-%m-%d %H:%M', (x.year, x.month, x.day, x.hour, x.minute, 0, 0, 0, 0))}",
     '%d/%m/%y %_I%P': lambda x: f"{time.strftime('%d/%m/%y %_I%P', (x.year, x.month, x.day, x.hour, x.minute, 0, 0, 0, 0))}",
@@ -36,9 +37,9 @@ display_mapper: Callable[
 
 def cursor_as_dict(cur):
     _col_idx_map=dict(map(lambda col: (col[1].name, col[0]), enumerate(cur.description)))
-    for row in map(lambda row, _map=_col_idx_map: dict([
-        (name, row[i]) for name, i in _map.items()
-    ]), cur.fetchall()):
+    for row in map(lambda row, _map=_col_idx_map: {
+        name: row[i] for name, i in _map.items()
+    }, cur.fetchall()):
         #print(row)
         yield row
 

+ 1 - 1
app/parse_recipe.py

@@ -4,10 +4,10 @@
 # All rights reserved
 #
 # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
+import re
 import yaml
 from yaml.loader import SafeLoader
 from .data.QueryManager import QueryManager
-import re
 
 def parse_recipe(fh, query_manager: QueryManager):
     contents = yaml.load(fh, Loader=SafeLoader)

+ 66 - 53
app/widgets.py

@@ -1,20 +1,36 @@
 #
-# Copyright (c) Daniel Sheffield 2021 - 2022
+# Copyright (c) Daniel Sheffield 2021 - 2023
 #
 # All rights reserved
 #
 # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
 from decimal import Decimal
-from typing import Any, Callable, Iterable, List, Union
-
-import urwid
-from additional_urwid_widgets import IndicativeListBox
+from typing import Any, Callable, Iterable, Union
 from itertools import chain, product
-from urwid import numedit
+from additional_urwid_widgets import IndicativeListBox
+
+from urwid import (
+    AttrMap,
+    AttrWrap,
+    BarGraph,
+    Button,
+    connect_signal,
+    CheckBox,
+    Columns,
+    Edit,
+    GraphVScale,
+    Pile,
+    SimpleFocusListWalker,
+    Text,
+    WidgetWrap,
+)
+from urwid.numedit import (
+    FloatEdit,
+)
 from urwid.wimp import PopUpLauncher
 
-class AutoCompleteEdit(urwid.Edit):
-    signals = [ *urwid.Edit.signals, 'apply', 'open' ]
+class AutoCompleteEdit(Edit):
+    signals = [ *Edit.signals, 'apply', 'open' ]
 
     def __init__(self, name: str, *args: Iterable, **kwargs):
         if isinstance(name, tuple):
@@ -32,15 +48,15 @@ class AutoCompleteEdit(urwid.Edit):
     def keypress(self, size, key):
         if key == 'enter':
             self._emit('apply', self.name)
-            return
-        elif key == 'delete':
+            return None
+        if key == 'delete':
             self.set_edit_text('')
-            return
+            return None
 
-        return urwid.Edit.keypress(self, (size[0],), key)
+        return super().keypress(size, key)
 
-class AutoCompleteFloatEdit(numedit.FloatEdit):
-    signals = [ *numedit.FloatEdit.signals, 'apply', 'open' ]
+class AutoCompleteFloatEdit(FloatEdit):
+    signals = [ *FloatEdit.signals, 'apply', 'open' ]
 
     def __init__(self, name: str, *args: Iterable, **kwargs: dict):
         self.last_val = None
@@ -101,32 +117,32 @@ class AutoCompleteFloatEdit(numedit.FloatEdit):
             if self.op in ops:
                 self.calc()
             self.set_op(key)
-            return
-        elif key == 'enter':
+            return None
+        if key == 'enter':
             if self.get_edit_text() == '' or self.value() == Decimal(0.0):
                 self._emit('apply', self.name)
-                return
+                return None
             self.calc()
-            return
-        elif key == '=':
+            return None
+        if key == '=':
             self.calc()
-            return
-        elif key == 'delete':
+            return None
+        if key == 'delete':
             self.set_edit_text('')
             self.op = '='
             self.update_caption()
-            return
+            return None
 
-        return numedit.FloatEdit.keypress(self, (size[0],), key)
+        return super().keypress(size, key)
 
-class NoTabCheckBox(urwid.CheckBox):
+class NoTabCheckBox(CheckBox):
+    
     def keypress(self, size, key):
         if not isinstance(key, tuple) and key == 'tab':
-            return
-        else:
-            return super().keypress(size, key)
+            return None
+        return super().keypress(size, key)
 
-class FocusWidget(urwid.WidgetWrap):
+class FocusWidget(WidgetWrap):
     ignore_focus = True
     def __init__(self, widget, focus_order, focus_widgets):
         super().__init__(widget)
@@ -146,7 +162,7 @@ class FocusWidget(urwid.WidgetWrap):
         _w1 = getattr(widget, 'original_widget', None)
         _w2 = getattr(widget, 'contents', None)
         if _w2 is not None:
-            return
+            return None
         if _w1 is not None:
             return self.find_widget(widget=_w1)
 
@@ -186,14 +202,15 @@ class FocusWidget(urwid.WidgetWrap):
             self._focus_widgets()
         ) if k == n]
 
-        for _prev, _cur, _next in zip([_p[-1], *_p[:-1]], _p, [*_p[1:], _p[0]]):
-            if list(_c) == list(_cur):
-                break
+        _prev, _, _next = next(filter(
+            lambda x: _c == list(x[1]),
+            zip([_p[-1], *_p[:-1]], _p, [*_p[1:], _p[0]])
+        ))
         if reverse:
             self.container.set_focus_path(_prev)
         else:
             self.container.set_focus_path(_next)
-        return
+
 
 class AutoCompletePopUp(PopUpLauncher):
     _default_pop_up_parameters = {
@@ -211,7 +228,7 @@ class AutoCompletePopUp(PopUpLauncher):
         self._pop_up_parameters = dict(**self._default_pop_up_parameters)
         self.apply_choice_cb = apply_choice_cb
         self.close_cb = close_cb
-        urwid.connect_signal(self._original_widget, 'open', lambda _, options: self._open_pop_up(options))
+        connect_signal(self._original_widget, 'open', lambda _, options: self._open_pop_up(options))
 
     def _open_pop_up(self, options):
         self.options = options
@@ -243,13 +260,13 @@ class AutoCompletePopUp(PopUpLauncher):
             self._original_widget.name, self.options,
             self.apply_choice_cb,
         )
-        urwid.connect_signal(pop_up, 'close', lambda _: self._close_pop_up())
+        connect_signal(pop_up, 'close', lambda _: self._close_pop_up())
         return pop_up
 
     def get_pop_up_parameters(self):
         return self._pop_up_parameters
 
-class SuggestionPopup(urwid.WidgetWrap):
+class SuggestionPopup(WidgetWrap):
 
     signals = ['close']
 
@@ -261,12 +278,12 @@ class SuggestionPopup(urwid.WidgetWrap):
         self.apply_cb = lambda _, v: apply_cb(name, v)
         body = []
         for c in options:
-            button = urwid.Button(c)
-            urwid.connect_signal(button, 'click', self.apply_cb, c)
-            urwid.connect_signal(button, 'click', lambda _: self._emit("close"))
-            body.append(urwid.AttrMap(button, None, focus_map='popup_focus'))
-        walker = urwid.SimpleFocusListWalker(body, wrap_around=False)
-        super().__init__(urwid.AttrWrap(IndicativeListBox(walker,
+            button = Button(c)
+            connect_signal(button, 'click', self.apply_cb, c)
+            connect_signal(button, 'click', lambda _: self._emit("close"))
+            body.append(AttrMap(button, None, focus_map='popup_focus'))
+        walker = SimpleFocusListWalker(body, wrap_around=False)
+        super().__init__(AttrWrap(IndicativeListBox(walker,
             topBar_endExposed_prop=("───", None, None),
             topBar_endCovered_prop=("▲ {} more ▲", None, None),
             bottomBar_endCovered_prop=("▼ {} more ▼", None, None),
@@ -277,14 +294,13 @@ class SuggestionPopup(urwid.WidgetWrap):
     def keypress(self, size, key):
         if key == 'esc':
             self._emit("close")
-            return
-
+            return None
         if key == 'tab':
-            return
+            return None
 
         return super().keypress(size, key)
 
-class FlowBarGraph(urwid.BarGraph):
+class FlowBarGraph(BarGraph):
     ignore_focus = True
     def __init__(self, height, *args, **kwargs):
         super().__init__(*args, **kwargs)
@@ -297,7 +313,7 @@ class FlowBarGraph(urwid.BarGraph):
         _size = (size[0], self.rows(size))
         return super().render(_size,focus=focus)
 
-class FlowGraphVScale(urwid.GraphVScale):
+class FlowGraphVScale(GraphVScale):
     ignore_focus = True
     def __init__(self, graph, *args, **kwargs):
         super().__init__(*args, **kwargs)
@@ -310,7 +326,7 @@ class FlowGraphVScale(urwid.GraphVScale):
         _size = (size[0], self.rows(size))
         return super().render(_size,focus=focus)
 
-class FlowBarGraphWithVScale(urwid.Columns):
+class FlowBarGraphWithVScale(Columns):
     ignore_focus = True
 
     @property
@@ -327,9 +343,6 @@ class FlowBarGraphWithVScale(urwid.Columns):
 
     @height.setter
     def height(self, value):
-        self._invalidate
-        self.graph._invalidate
-        self.graph_vscale._invalidate
         self.graph.height = value
 
     def set_bar_width(self, width):
@@ -359,10 +372,10 @@ class FlowBarGraphWithVScale(urwid.Columns):
         self._canvas_width = cols - 6
         self.graph = FlowBarGraph(rows, attr, hatt=hatt)
         self.graph_vscale = FlowGraphVScale(self.graph, [], 0)
-        self.graph_caption = urwid.Text(u'')
+        self.graph_caption = Text(u'')
         super().__init__([
             (self._vscale_width, self.graph_vscale),
-            (self._canvas_width, urwid.Pile([
+            (self._canvas_width, Pile([
                 self.graph,
                 self.graph_caption
             ]))