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 <willbeason@gmail.com>
This commit is contained in:
Will Beason 2025-05-29 15:46:45 -05:00
parent aec6e5fafa
commit 4dde25c508

33
wikiq
View File

@ -10,6 +10,7 @@ import os.path
import re import re
from datetime import datetime, timezone from datetime import datetime, timezone
from io import TextIOWrapper from io import TextIOWrapper
from itertools import groupby
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
from collections import deque from collections import deque
@ -93,6 +94,10 @@ class WikiqPage:
self.mwpage = page self.mwpage = page
self.__revisions = self.rev_list() 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): def rev_list(self):
# Outline for how we want to handle collapse_user=True # Outline for how we want to handle collapse_user=True
# iteration rev.user prev_rev.user add prev_rev? # iteration rev.user prev_rev.user add prev_rev?
@ -108,27 +113,13 @@ class WikiqPage:
yield rev yield rev
return return
collapsed_revs = 1 for _, revs in groupby(self.mwpage, self.user_text):
prev_rev = next(self.mwpage) # All revisions are either from the same user, or this is a single
prev_rev.collapsed_revs = collapsed_revs # revision where the user is missing.
revs = list(revs)
for rev in self.mwpage: rev = revs[-1]
# yield if this is the last edit in a seq by a user and reset rev.collapsed_revs = len(revs)
# also yield if we don't know who the user is yield rev
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
def __iter__(self): def __iter__(self):
return self.__revisions return self.__revisions