diff --git a/lona/client2/_lona/client2/rendering-engine.js b/lona/client2/_lona/client2/rendering-engine.js index 26f32d86..170883d3 100644 --- a/lona/client2/_lona/client2/rendering-engine.js +++ b/lona/client2/_lona/client2/rendering-engine.js @@ -104,6 +104,7 @@ export class LonaRenderingEngine { node.remove(); this._remove_widget_if_present(node_id); + this._clean_node_cache(); }; _remove_widget_if_present(node_id) { diff --git a/lona/logging.py b/lona/logging.py index bf353bc4..4aaa864f 100644 --- a/lona/logging.py +++ b/lona/logging.py @@ -10,6 +10,7 @@ terminal_supports_colors, colors_are_enabled, ) +from lona.errors import ClientError try: # syslog is only on unix based systems available @@ -62,10 +63,11 @@ def exclude(self, logger_name): self.excluded.append(logger_name) def filter(self, record): - # filter exceptions that lona.command_line.run_server.run_server - # handles it self if record.exc_info: + # filter exceptions that lona.command_line.run_server.run_server + # handles it self + # OSErrors if (isinstance(record.exc_info[1], OSError) and record.exc_info[1].errno in (13, 98)): @@ -78,6 +80,11 @@ def filter(self, record): return False + # filter exceptions that Lona logs it-self to avoid + # duplicate logs + if isinstance(record.exc_info[1], ClientError): + return False + if record.name == 'lona': # The lona root logger is used by the command line tools # to report errors, for example when startup is not possible due diff --git a/test_project/views/frontend/rendering.py b/test_project/views/frontend/rendering.py index 23a156ed..6b67746d 100644 --- a/test_project/views/frontend/rendering.py +++ b/test_project/views/frontend/rendering.py @@ -385,7 +385,27 @@ def step_06(self): @client_version(1, 2) def step_07(self): - self.set_step_label(7, 'Remove Node') + self.set_step_label(7, 'Move Node') + + moving_node = Div('node 3') + + self.rendering_root.nodes = [ + Div( + 'node 1', + moving_node, + ), + Div('node 2'), + ] + + self.show() + + self.rendering_root[1].append(moving_node) + + self.show() + + @client_version(1, 2) + def step_08(self): + self.set_step_label(8, 'Remove Node') self.rendering_root.nodes = [ Div('node 1'), @@ -396,8 +416,8 @@ def step_07(self): self.rendering_root.nodes[1].remove() @client_version(1, 2) - def step_08(self): - self.set_step_label(8, 'Slice Node List') + def step_09(self): + self.set_step_label(9, 'Slice Node List') self.rendering_root.nodes = [ Div('node 1'), @@ -413,94 +433,94 @@ def step_08(self): # id_list tests @client_version(1, 2) - def step_09(self): - self.set_step_label(9, 'Set id') + def step_10(self): + self.set_step_label(10, 'Set id') self.rendering_root.nodes = [ Div(_id='foo bar'), ] @client_version(1, 2) - def step_10(self): - self.set_step_label(10, 'Add id') + def step_11(self): + self.set_step_label(11, 'Add id') self.rendering_root.nodes[0].id_list.add('baz') @client_version(1, 2) - def step_11(self): - self.set_step_label(11, 'Remove id') + def step_12(self): + self.set_step_label(12, 'Remove id') self.rendering_root.nodes[0].id_list.remove('bar') @client_version(1, 2) - def step_12(self): - self.set_step_label(12, 'Reset id') + def step_13(self): + self.set_step_label(13, 'Reset id') self.rendering_root.nodes[0].id_list = ['foo1', 'bar1'] @client_version(1, 2) - def step_13(self): - self.set_step_label(13, 'Clear id') + def step_14(self): + self.set_step_label(14, 'Clear id') self.rendering_root.nodes[0].id_list.clear() # class_list tests @client_version(1, 2) - def step_14(self): - self.set_step_label(14, 'Set class') + def step_15(self): + self.set_step_label(15, 'Set class') self.rendering_root.nodes = [ Div(_class='foo bar'), ] @client_version(1, 2) - def step_15(self): - self.set_step_label(15, 'Add class') + def step_16(self): + self.set_step_label(16, 'Add class') self.rendering_root.nodes[0].class_list.add('baz') @client_version(1, 2) - def step_16(self): - self.set_step_label(16, 'Remove class') + def step_17(self): + self.set_step_label(17, 'Remove class') self.rendering_root.nodes[0].class_list.remove('bar') @client_version(1, 2) - def step_17(self): - self.set_step_label(17, 'Reset class') + def step_18(self): + self.set_step_label(18, 'Reset class') self.rendering_root.nodes[0].class_list = ['foo1', 'bar1'] @client_version(1, 2) - def step_18(self): - self.set_step_label(18, 'Clear class') + def step_19(self): + self.set_step_label(19, 'Clear class') self.rendering_root.nodes[0].class_list.clear() # attribute tests @client_version(1, 2) - def step_19(self): - self.set_step_label(19, 'Set attributes') + def step_20(self): + self.set_step_label(20, 'Set attributes') self.rendering_root.nodes = [ Div(foo='foo', bar='bar'), ] @client_version(1, 2) - def step_20(self): - self.set_step_label(20, 'Add attribute') + def step_21(self): + self.set_step_label(21, 'Add attribute') self.rendering_root.nodes[0].attributes['baz'] = 'baz' @client_version(1, 2) - def step_21(self): - self.set_step_label(21, 'Remove attribute') + def step_22(self): + self.set_step_label(22, 'Remove attribute') del self.rendering_root.nodes[0].attributes['foo'] @client_version(1, 2) - def step_22(self): - self.set_step_label(22, 'Reset attributes') + def step_23(self): + self.set_step_label(23, 'Reset attributes') self.rendering_root.nodes[0].attributes = { 'foo1': 'bar1', @@ -508,14 +528,14 @@ def step_22(self): } @client_version(1, 2) - def step_23(self): - self.set_step_label(23, 'Clear attributes') + def step_24(self): + self.set_step_label(24, 'Clear attributes') self.rendering_root.nodes[0].attributes.clear() @client_version(1, 2) - def step_24(self): - self.set_step_label(24, 'HTML Symbols') + def step_25(self): + self.set_step_label(25, 'HTML Symbols') self.rendering_root.nodes = [ '€', @@ -525,51 +545,51 @@ def step_24(self): # style tests @client_version(1, 2) - def step_25(self): - self.set_step_label(25, 'Empty style') + def step_26(self): + self.set_step_label(26, 'Empty style') self.rendering_root.nodes = [ Div(), ] @client_version(1, 2) - def step_26(self): - self.set_step_label(26, 'Set style') + def step_27(self): + self.set_step_label(27, 'Set style') self.rendering_root.nodes = [ Div(_style='top: 1px; right: 2px; --non-standard: 3;'), ] @client_version(1, 2) - def step_27(self): - self.set_step_label(27, 'Add style') + def step_28(self): + self.set_step_label(28, 'Add style') self.rendering_root.nodes[0].style['bottom'] = '3px' @client_version(1, 2) - def step_28(self): - self.set_step_label(28, 'Remove style') + def step_29(self): + self.set_step_label(29, 'Remove style') del self.rendering_root.nodes[0].style['top'] @client_version(1, 2) - def step_29(self): - self.set_step_label(29, 'Reset style') + def step_30(self): + self.set_step_label(30, 'Reset style') self.rendering_root.nodes[0].style = { 'left': '4px', } @client_version(1, 2) - def step_30(self): - self.set_step_label(30, 'Clear style') + def step_31(self): + self.set_step_label(31, 'Clear style') self.rendering_root.nodes[0].style.clear() # legacy widget api tests @client_version(1, 2) - def step_31(self): - self.set_step_label(31, 'Legacy Widget API: setup') + def step_32(self): + self.set_step_label(32, 'Legacy Widget API: setup') self.rendering_root.nodes = [ LegacyWidgetApiTestComponent( @@ -579,8 +599,8 @@ def step_31(self): ] @client_version(1, 2) - def step_32(self): - self.set_step_label(32, 'Legacy Widget API: data: list: append') + def step_33(self): + self.set_step_label(33, 'Legacy Widget API: data: list: append') component = self.rendering_root.nodes[0] @@ -590,8 +610,8 @@ def step_32(self): component.update_state() @client_version(1, 2) - def step_33(self): - self.set_step_label(33, 'Legacy Widget API: data: list: remove') + def step_34(self): + self.set_step_label(34, 'Legacy Widget API: data: list: remove') component = self.rendering_root.nodes[0] @@ -599,8 +619,8 @@ def step_33(self): component.update_state() @client_version(1, 2) - def step_34(self): - self.set_step_label(34, 'Legacy Widget API: data: list: insert') + def step_35(self): + self.set_step_label(35, 'Legacy Widget API: data: list: insert') component = self.rendering_root.nodes[0] @@ -608,8 +628,8 @@ def step_34(self): component.update_state() @client_version(1, 2) - def step_35(self): - self.set_step_label(35, 'Legacy Widget API: data: list: clear') + def step_36(self): + self.set_step_label(36, 'Legacy Widget API: data: list: clear') component = self.rendering_root.nodes[0] @@ -617,8 +637,8 @@ def step_35(self): component.update_state() @client_version(1, 2) - def step_36(self): - self.set_step_label(36, 'Legacy Widget API: data: list: reset') + def step_37(self): + self.set_step_label(37, 'Legacy Widget API: data: list: reset') component = self.rendering_root.nodes[0] @@ -626,8 +646,8 @@ def step_36(self): component.update_state() @client_version(1, 2) - def step_37(self): - self.set_step_label(37, 'Legacy Widget API: data: dict: setup') + def step_38(self): + self.set_step_label(38, 'Legacy Widget API: data: dict: setup') component = self.rendering_root.nodes[0] @@ -635,8 +655,8 @@ def step_37(self): component.update_state() @client_version(1, 2) - def step_38(self): - self.set_step_label(38, 'Legacy Widget API: data: dict: set') + def step_39(self): + self.set_step_label(39, 'Legacy Widget API: data: dict: set') component = self.rendering_root.nodes[0] @@ -646,8 +666,8 @@ def step_38(self): component.update_state() @client_version(1, 2) - def step_39(self): - self.set_step_label(39, 'Legacy Widget API: data: dict: del') + def step_40(self): + self.set_step_label(40, 'Legacy Widget API: data: dict: del') component = self.rendering_root.nodes[0] @@ -655,8 +675,8 @@ def step_39(self): component.update_state() @client_version(1, 2) - def step_40(self): - self.set_step_label(40, 'Legacy Widget API: data: dict: pop') + def step_41(self): + self.set_step_label(41, 'Legacy Widget API: data: dict: pop') component = self.rendering_root.nodes[0] @@ -664,8 +684,8 @@ def step_40(self): component.update_state() @client_version(1, 2) - def step_41(self): - self.set_step_label(41, 'Legacy Widget API: data: dict: clear') + def step_42(self): + self.set_step_label(42, 'Legacy Widget API: data: dict: clear') component = self.rendering_root.nodes[0] @@ -673,8 +693,8 @@ def step_41(self): component.update_state() @client_version(1, 2) - def step_42(self): - self.set_step_label(42, 'Legacy Widget API: data: dict: reset') + def step_43(self): + self.set_step_label(43, 'Legacy Widget API: data: dict: reset') component = self.rendering_root.nodes[0] @@ -682,15 +702,15 @@ def step_42(self): component.update_state() @client_version(1, 2) - def step_43(self): - self.set_step_label(43, 'Legacy Widget API: destroy') + def step_44(self): + self.set_step_label(44, 'Legacy Widget API: destroy') self.rendering_root.nodes.pop(0) # widget api tests @client_version(1, 2) - def step_44(self): - self.set_step_label(44, 'Widget API: setup') + def step_45(self): + self.set_step_label(45, 'Widget API: setup') self.rendering_root.nodes = [ WidgetApiTestComponent( @@ -700,8 +720,8 @@ def step_44(self): ] @client_version(1, 2) - def step_45(self): - self.set_step_label(45, 'Widget API: data: list: append') + def step_46(self): + self.set_step_label(46, 'Widget API: data: list: append') component = self.rendering_root.nodes[0] @@ -711,8 +731,8 @@ def step_45(self): component.update_state() @client_version(1, 2) - def step_46(self): - self.set_step_label(46, 'Widget API: data: list: remove') + def step_47(self): + self.set_step_label(47, 'Widget API: data: list: remove') component = self.rendering_root.nodes[0] @@ -720,8 +740,8 @@ def step_46(self): component.update_state() @client_version(1, 2) - def step_47(self): - self.set_step_label(47, 'Widget API: data: list: insert') + def step_48(self): + self.set_step_label(48, 'Widget API: data: list: insert') component = self.rendering_root.nodes[0] @@ -729,8 +749,8 @@ def step_47(self): component.update_state() @client_version(1, 2) - def step_48(self): - self.set_step_label(48, 'Widget API: data: list: clear') + def step_49(self): + self.set_step_label(49, 'Widget API: data: list: clear') component = self.rendering_root.nodes[0] @@ -738,8 +758,8 @@ def step_48(self): component.update_state() @client_version(1, 2) - def step_49(self): - self.set_step_label(49, 'Widget API: data: list: reset') + def step_50(self): + self.set_step_label(50, 'Widget API: data: list: reset') component = self.rendering_root.nodes[0] @@ -747,8 +767,8 @@ def step_49(self): component.update_state() @client_version(1, 2) - def step_50(self): - self.set_step_label(50, 'Widget API: data: dict: setup') + def step_51(self): + self.set_step_label(51, 'Widget API: data: dict: setup') component = self.rendering_root.nodes[0] @@ -756,8 +776,8 @@ def step_50(self): component.update_state() @client_version(1, 2) - def step_51(self): - self.set_step_label(51, 'Widget API: data: dict: set') + def step_52(self): + self.set_step_label(52, 'Widget API: data: dict: set') component = self.rendering_root.nodes[0] @@ -767,8 +787,8 @@ def step_51(self): component.update_state() @client_version(1, 2) - def step_52(self): - self.set_step_label(52, 'Widget API: data: dict: del') + def step_53(self): + self.set_step_label(53, 'Widget API: data: dict: del') component = self.rendering_root.nodes[0] @@ -776,8 +796,8 @@ def step_52(self): component.update_state() @client_version(1, 2) - def step_53(self): - self.set_step_label(53, 'Widget API: data: dict: pop') + def step_54(self): + self.set_step_label(54, 'Widget API: data: dict: pop') component = self.rendering_root.nodes[0] @@ -785,8 +805,8 @@ def step_53(self): component.update_state() @client_version(1, 2) - def step_54(self): - self.set_step_label(54, 'Widget API: data: dict: clear') + def step_55(self): + self.set_step_label(55, 'Widget API: data: dict: clear') component = self.rendering_root.nodes[0] @@ -794,8 +814,8 @@ def step_54(self): component.update_state() @client_version(1, 2) - def step_55(self): - self.set_step_label(55, 'Widget API: data: dict: reset') + def step_56(self): + self.set_step_label(56, 'Widget API: data: dict: reset') component = self.rendering_root.nodes[0] @@ -803,15 +823,15 @@ def step_55(self): component.update_state() @client_version(1, 2) - def step_56(self): - self.set_step_label(56, 'Widget API: destroy') + def step_57(self): + self.set_step_label(57, 'Widget API: destroy') self.rendering_root.nodes.pop(0) # raw html ################################################################ @client_version(1, 2) - def step_57(self): - self.set_step_label(57, 'Raw HTML: Setup') + def step_58(self): + self.set_step_label(58, 'Raw HTML: Setup') self.rendering_root.nodes = [ Div( @@ -822,16 +842,16 @@ def step_57(self): ] @client_version(1, 2) - def step_58(self): - self.set_step_label(58, 'Raw HTML: Reset') + def step_59(self): + self.set_step_label(59, 'Raw HTML: Reset') self.rendering_root.nodes[0][0].inner_html = """