From 74a07325f91883333752987cfd27ed707a41c689 Mon Sep 17 00:00:00 2001 From: Thom Smith Date: Mon, 29 Mar 2021 11:41:02 -0400 Subject: [PATCH 1/2] Fix a bug when changing settings in a subscribe callback. --- st3/sublime_lib/settings_dict.py | 9 +++++---- tests/test_settings_dict.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/st3/sublime_lib/settings_dict.py b/st3/sublime_lib/settings_dict.py index ffb3b9f..af64e7d 100644 --- a/st3/sublime_lib/settings_dict.py +++ b/st3/sublime_lib/settings_dict.py @@ -181,15 +181,16 @@ def subscribe( """ selector_fn = get_selector(selector) - previous_value = selector_fn(self) + saved_value = selector_fn(self) def onchange() -> None: - nonlocal previous_value + nonlocal saved_value new_value = selector_fn(self) - if new_value != previous_value: + if new_value != saved_value: + previous_value = saved_value + saved_value = new_value callback(new_value, previous_value) - previous_value = new_value key = str(uuid4()) self.settings.add_on_change(key, onchange) diff --git a/tests/test_settings_dict.py b/tests/test_settings_dict.py index 25a1c4e..7b89c59 100644 --- a/tests/test_settings_dict.py +++ b/tests/test_settings_dict.py @@ -188,3 +188,17 @@ def callback(new, old): 'example_1': 10, 'example_2': 2 }) + + def test_settings_change_in_callback(self): + calls = [] + def callback(new, old): + calls.append((new, old)) + self.fancy['bar'] = True + + self.fancy.subscribe('foo', callback) + + self.fancy['foo'] = True + + self.assertEqual(calls, [ + (True, None) + ]) From 79da3dceafd5a8968b7d47f808f44119437b0187 Mon Sep 17 00:00:00 2001 From: Thom Smith Date: Mon, 29 Mar 2021 11:44:23 -0400 Subject: [PATCH 2/2] Fix flake issue. --- tests/test_settings_dict.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_settings_dict.py b/tests/test_settings_dict.py index 7b89c59..d57f385 100644 --- a/tests/test_settings_dict.py +++ b/tests/test_settings_dict.py @@ -191,6 +191,7 @@ def callback(new, old): def test_settings_change_in_callback(self): calls = [] + def callback(new, old): calls.append((new, old)) self.fancy['bar'] = True