website/scripts/add_outdated_banner.py

93 lines
2.8 KiB
Python

"""Mark outdated docs as requiring updating
This script finds all markdown files under `content/` that haven't been updated
recently (default 30 days) according to git, and adds a header warning that the
file is out of date.
Example usage:
python scripts/add_outdated_banner.py --old-version 1.0 --new-version 1.1
"""
import argparse
import re
from datetime import datetime, timedelta
from pathlib import Path
from subprocess import check_output
WARNING = """
{{%% alert title="Out of date" color="warning" %%}}
This guide contains outdated information pertaining to Kubeflow %s. This guide
needs to be updated for Kubeflow %s.
{{%% /alert %%}}
"""
WARNING_REGEX = r"""
{{% alert title="Out of date".*{{% /alert %}}
"""
def main(warning_text: str, cutoff: timedelta):
now = datetime.utcnow().astimezone()
for md in Path("content/").rglob("*.md"):
last_changed = check_output(
["git", "log", "-1", "--pretty=format:%ci", md]
).decode("utf-8")
last_changed = datetime.strptime(last_changed, "%Y-%m-%d %H:%M:%S %z")
# If the docs are recent, don't add the header
if now - last_changed < cutoff:
continue
contents = md.read_text()
# If the doc already has an out of date warning, replace it with the new one
if re.search(WARNING_REGEX, contents, flags=re.MULTILINE | re.DOTALL):
md.write_text(
re.sub(
WARNING_REGEX,
warning_text,
contents,
flags=re.MULTILINE | re.DOTALL,
)
)
# Otherwise, check to see if there's a front matter section delimited by `+++`. If so,
# add the out of date warning directly afterwards.
else:
pluses = list(re.finditer(r"\+\+\+", contents))
if len(pluses) == 2:
p = pluses[1]
# If there's only a front matter section and no actual content, don't bother
# adding the warning.
if contents[p.end():].strip():
md.write_text(contents[:p.end()] + warning_text + contents[p.end():])
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Mark old docs as requiring updating")
parser.add_argument(
"--old-version",
required=True,
help="The docs version that is considered out of date",
)
parser.add_argument("--new-version", required=True, help="The newest docs version")
parser.add_argument(
"--cutoff",
default=30,
type=int,
help="Cutoff in days that a document must have been "
"updated within to not be considered out of date",
)
args = parser.parse_args()
main(WARNING % (args.old_version, args.new_version), timedelta(days=args.cutoff))