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
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