"""
Shows aggregated CHANGELOG.md files for INSTALLED_EXTENSIONS
"""
import os
import re
from importlib import import_module
import mistune
from q2_sdk.core.http_handlers.base_handler import Q2BaseRequestHandler
from q2_sdk.tools import utils
[docs]
class ChangeLogHandler(Q2BaseRequestHandler):
async def get(self, extension_name=None):
if extension_name:
self.get_single_extension(extension_name)
return
extension_list = []
try:
with open("CHANGELOG.md") as changelog:
repo_changelog = changelog.read().split("\n")
repo_changelog = "\n".join(repo_changelog[1:])
except FileNotFoundError:
repo_changelog = None
for extension in utils.get_installed_extensions_as_modules():
if "q2_sdk.extensions" in extension:
continue
url_module = import_module("{}.urls".format(extension))
changelog_filepath = os.path.join(
os.path.dirname(url_module.__file__), "CHANGELOG.md"
)
if not os.path.exists(changelog_filepath):
version = "No extension changelog"
else:
with open(changelog_filepath) as handle:
body = handle.read()
version = re.search(r"Current Version: \[([^]]+)", body).group(1)
extension_list.append({"name": extension, "version": version})
template = self.get_template(
"changelog_summary.md.jinja2",
{"extension_list": extension_list, "repo_changelog": repo_changelog},
)
self.write(mistune.markdown(template))
def get_single_extension(self, extension_name):
try:
url_module = import_module("{}.urls".format(extension_name))
except ModuleNotFoundError:
self.write(f"No extension named {extension_name}")
self.set_status(404)
return
changelog_filepath = os.path.join(
os.path.dirname(url_module.__file__), "CHANGELOG.md"
)
if not os.path.exists(changelog_filepath):
self.write(f"Invalid changelog for {extension_name}")
self.set_status(404)
return
with open(changelog_filepath) as handle:
body = handle.read()
self.write(mistune.markdown(body))