From 4f097a3a89de0f9c38fe01081cb862c3c07a4dcd Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Tue, 31 Jul 2012 11:37:51 -0400 Subject: [PATCH] [#204 state:fixed] Added a message after re-prioritization telling how many dupe groups were changed by it. --- core/app.py | 6 +++++- core/engine.py | 9 +++++++-- core/tests/engine_test.py | 10 +++++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/core/app.py b/core/app.py index b9c06a02..233191ba 100644 --- a/core/app.py +++ b/core/app.py @@ -502,9 +502,13 @@ class DupeGuru(RegistrableApplication, Broadcaster): return False def reprioritize_groups(self, sort_key): + count = 0 for group in self.results.groups: - group.prioritize(key_func=sort_key) + if group.prioritize(key_func=sort_key): + count += 1 self._results_changed() + msg = tr("{} duplicate groups were changed by the re-prioritization.").format(count) + self.view.show_message(msg) def reveal_selected(self): if self.selected_dupes: diff --git a/core/engine.py b/core/engine.py index 173927d6..73eba0ab 100644 --- a/core/engine.py +++ b/core/engine.py @@ -290,10 +290,13 @@ class Group: def prioritize(self, key_func, tie_breaker=None): # tie_breaker(ref, dupe) --> True if dupe should be ref + # Returns True if anything changed during prioritization. master_key_func = lambda x: (-x.is_ref, key_func(x)) - self.ordered.sort(key=master_key_func) + new_order = sorted(self.ordered, key=master_key_func) + changed = new_order != self.ordered + self.ordered = new_order if tie_breaker is None: - return + return changed ref = self.ref key_value = key_func(ref) for dupe in self.dupes: @@ -303,6 +306,8 @@ class Group: ref = dupe if ref is not self.ref: self.switch_ref(ref) + return True + return changed def remove_dupe(self, item, discard_matches=True): try: diff --git a/core/tests/engine_test.py b/core/tests/engine_test.py index d8f513ef..b6dc58c4 100644 --- a/core/tests/engine_test.py +++ b/core/tests/engine_test.py @@ -656,7 +656,7 @@ class TestCaseGroup: g.add_match(m2) g.add_match(m3) assert o1 is g.ref - g.prioritize(lambda x:x.name) + assert g.prioritize(lambda x:x.name) assert o3 is g.ref def test_prioritize_with_tie_breaker(self): @@ -703,6 +703,14 @@ class TestCaseGroup: g.prioritize(lambda x: -x.size) assert g.ref is o1 + def test_prioritize_nothing_changes(self): + # prioritize() returns False when nothing changes in the group. + g = get_test_group() + g[0].name = 'a' + g[1].name = 'b' + g[2].name = 'c' + assert not g.prioritize(lambda x:x.name) + def test_list_like(self): g = Group() o1,o2 = (NamedObject("foo",True),NamedObject("bar",True))