From 4dde25c5086be353d44d0d098eeac64b10220e79 Mon Sep 17 00:00:00 2001 From: Will Beason Date: Thu, 29 May 2025 15:46:45 -0500 Subject: [PATCH] Refactor revision logic to make more straightforward Use groupby so we don't have to deal with edge cases and compare revisions directly. Signed-off-by: Will Beason --- wikiq | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/wikiq b/wikiq index 8a2e6d1..34a97da 100755 --- a/wikiq +++ b/wikiq @@ -10,6 +10,7 @@ import os.path import re from datetime import datetime, timezone from io import TextIOWrapper +from itertools import groupby from subprocess import Popen, PIPE from collections import deque @@ -93,6 +94,10 @@ class WikiqPage: self.mwpage = page self.__revisions = self.rev_list() + @staticmethod + def user_text(rev) -> str | None: + return None if rev.deleted.user else rev.user.text + def rev_list(self): # Outline for how we want to handle collapse_user=True # iteration rev.user prev_rev.user add prev_rev? @@ -108,27 +113,13 @@ class WikiqPage: yield rev return - collapsed_revs = 1 - prev_rev = next(self.mwpage) - prev_rev.collapsed_revs = collapsed_revs - - for rev in self.mwpage: - # yield if this is the last edit in a seq by a user and reset - # also yield if we don't know who the user is - - if rev.deleted.user or prev_rev.deleted.user or rev.user.text != prev_rev.user.text: - yield prev_rev - collapsed_revs = 1 - rev.collapsed_revs = collapsed_revs - else: - # Otherwise, collapse revision. - collapsed_revs += 1 - rev.collapsed_revs = collapsed_revs - - prev_rev = rev - - # also yield the final time - yield prev_rev + for _, revs in groupby(self.mwpage, self.user_text): + # All revisions are either from the same user, or this is a single + # revision where the user is missing. + revs = list(revs) + rev = revs[-1] + rev.collapsed_revs = len(revs) + yield rev def __iter__(self): return self.__revisions