11#!/usr/bin/env python3
22# -*- coding: utf-8 -*-
33# Copyright (c) Alianza, Inc. All rights reserved.
4- """A tool for announcing keepachangelog format logs to Slack and Microsoft
5- Teams channels"""
4+ """A tool for announcing keepachangelog format logs to Slack and Microsoft Teams channels"""
65
76import argparse
87import json
98import logging
109import re
1110import sys
1211from enum import Enum
13- from typing import Any , Dict , List , Optional , Tuple
12+ from typing import Any , Dict , List , Optional , Tuple , Union
1413
15- import mistletoe
1614import requests
17- from mistletoe .base_renderer import BaseRenderer
15+ from mistletoe .block_token import Document
1816
1917from .changelogrenderer import ChangeLogRenderer
2018from .teamschangelogrenderer import TeamsChangeLogRenderer
2119
2220log = logging .getLogger (__name__ )
2321
22+ ValidRenderers = Union [ChangeLogRenderer , TeamsChangeLogRenderer ]
23+
2424
2525DIFF_URL_RE = re .compile ("^(.*)/compare/[^/]+[.][.][.]([^/]+)$" )
2626TREE_URL_RE = re .compile ("^(.*)/tree/([^/]+)$" )
2929def derive_urls (
3030 diff_url : Optional [str ],
3131) -> Tuple [Optional [str ], Optional [str ]]:
32+ """Derive base and reference URLs from a GitHub compare or tree URL."""
3233 base_url = None
3334 reference = None
3435 if diff_url :
@@ -44,10 +45,13 @@ def derive_urls(
4445
4546
4647class TargetTypes (Enum ):
48+ """Supported announcement targets."""
49+
4750 SLACK = "slack"
4851 TEAMS = "teams"
4952
50- def __str__ (self ):
53+ def __str__ (self ) -> str :
54+ """Return the enum value for argparse and logging display."""
5155 return self .value
5256
5357
@@ -85,7 +89,7 @@ def announce_slack(
8589 username : Optional [str ] = None ,
8690 icon_url : Optional [str ] = None ,
8791 icon_emoji : Optional [str ] = None ,
88- ):
92+ ) -> None :
8993 """Announce changelog changes to Slack"""
9094 # Get the changelog
9195 log .info ("Querying changelog %s" , changelogfile )
@@ -166,7 +170,7 @@ def announce_teams(
166170 changelogfile : str ,
167171 projectname : str ,
168172 compatibility_teams_sections : bool ,
169- ):
173+ ) -> None :
170174 """Announce changelog changes to Teams"""
171175 # Get the changelog
172176 log .info ("Querying changelog %s" , changelogfile )
@@ -251,15 +255,19 @@ def announce_teams(
251255
252256
253257class Changelog (object ):
254- def __init__ (self , filename : str , renderer_class : type [BaseRenderer ]) -> None :
258+ """Helper for loading and rendering changelog sections."""
259+
260+ def __init__ (self , filename : str , renderer_class : type [ValidRenderers ]) -> None :
261+ """Create a changelog reader bound to a renderer implementation."""
255262 self .filename = filename
256263 self .renderer_class = renderer_class
257264
258265 def get_version_details (
259266 self , version : str
260267 ) -> Tuple [str , Optional [str ], List [Dict [str , str ]]]:
268+ """Render and return details for a specific changelog version."""
261269 with open (self .filename , "r" ) as f :
262- document = mistletoe . Document (f )
270+ document = Document (f )
263271
264272 with self .renderer_class (version ) as renderer :
265273 rendered = renderer .render (document )
@@ -270,9 +278,8 @@ def get_version_details(
270278 return rendered , diff_url , sections
271279
272280
273- def main ():
281+ def main () -> None :
274282 """Main handling function."""
275-
276283 # Run main script.
277284 parser = argparse .ArgumentParser (
278285 description = "Announce CHANGELOG changes on Slack and Microsoft Teams"
0 commit comments