Skip to content

Commit

Permalink
A script to upload release notes to Tidelift
Browse files Browse the repository at this point in the history
  • Loading branch information
nedbat committed May 19, 2019
1 parent 1083b33 commit e6bd510
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 1 deletion.
2 changes: 1 addition & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ include .editorconfig
include .readthedocs.yml

recursive-include ci *.*
exclude ci/appveyor.token
exclude ci/*.token

recursive-include coverage/fullcoverage *.py
recursive-include coverage/ctracer *.c *.h
Expand Down
95 changes: 95 additions & 0 deletions ci/upload_relnotes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
#!/usr/bin/env python3
"""
Upload CHANGES.rst to Tidelift as Markdown chunks
"""

import re
import subprocess

import requests

class Buffer:
def __init__(self):
self.buffer = []

def append(self, text):
self.buffer.append(text)

def clear(self):
self.buffer = []

def flush(self):
buffered = "".join(self.buffer).strip()
if buffered:
yield ("text", buffered)
self.clear()


def parse_md(lines):
buffer = Buffer()

for line in lines:
header_match = re.search(r"^(#+) (.+)$", line)
is_header = bool(header_match)
if is_header:
yield from buffer.flush()
hashes, text = header_match.groups()
yield (f"h{len(hashes)}", text)
else:
buffer.append(line)
yield from buffer.flush()


def sections(parsed_data):
"""Convert a stream of parsed tokens into sections with text and notes.
Yields a stream of:
('h-level', 'header text', 'text')
"""
header = None
text = []
for ttype, ttext in parsed_data:
if ttype.startswith('h'):
if header:
yield (*header, "\n".join(text))
text = []
notes = []
header = (ttype, ttext)
elif ttype == "text":
text.append(ttext)
else:
raise Exception(f"Don't know ttype {ttype!r}")
yield (*header, "\n".join(text))


def relnotes(mdlines):
for hlevel, htext, text in sections(parse_md(mdlines)):
if hlevel == 'h2' and htext.startswith('Version '):
version = htext.split()[1]
yield version, text

def convert_rst_file_to_markdown(rst_filename):
markdown = subprocess.check_output(["pandoc", "-frst", "-tmarkdown_strict", "--atx-headers", rst_filename])
return markdown.decode("utf8")

def update_release_note(package, version, text):
url = f"https://api.tidelift.com/external-api/lifting/{package}/release-notes/{version}"
with open("ci/tidelift.token") as ftoken:
token = ftoken.read().strip()
headers = {
"Authorization": f"Bearer: {token}",
}
req_args = dict(url=url, data=text.encode('utf8'), headers=headers)
result = requests.post(**req_args)
if result.status_code == 409:
result = requests.put(**req_args)
print(f"{version}: {result.status_code}")

def main():
markdown = convert_rst_file_to_markdown("CHANGES.rst")
for version, text in relnotes(markdown.splitlines(True)):
update_release_note("pypi/coverage", version, text)

if __name__ == "__main__":
main()
2 changes: 2 additions & 0 deletions howto.txt
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@
- wait for the new tag build to finish successfully.
- visit https://readthedocs.org/dashboard/coverage/versions/
- change the default version to the new version
- Update Tidelift:
- python ci/upload_relnotes.py
- Visit the fixed issues on GitHub and mention the version it was fixed in.
- Announce on [email protected] .
- Announce on TIP.
Expand Down

0 comments on commit e6bd510

Please sign in to comment.