1
0

fetch_milestone.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/usr/bin/env python3
  2. import argparse
  3. import re
  4. import sys
  5. from typing import Dict, List
  6. import requests
  7. BASE_URL = 'https://api.github.com/repos/zauberzeug/nicegui'
  8. parser = argparse.ArgumentParser(description='Fetch the content of a milestone from a GitHub repo.')
  9. parser.add_argument('milestone_title', help='Title of the milestone to fetch.')
  10. args = parser.parse_args()
  11. milestone_title: str = args.milestone_title
  12. milestones = requests.get(f'{BASE_URL}/milestones?state=all&per_page=100', timeout=5).json()
  13. matching_milestones = [milestone for milestone in milestones if milestone['title'] == milestone_title]
  14. if not matching_milestones:
  15. print(f'Milestone "{milestone_title}" not found!')
  16. sys.exit(1)
  17. milestone_number = matching_milestones[0]['number']
  18. def link(number: int) -> str:
  19. # https://stackoverflow.com/a/71309268/3419103
  20. escape_mask = '\033]8;{};{}\033\\{}\033]8;;\033\\'
  21. return escape_mask.format('', f'https://github.com/zauberzeug/nicegui/issues/{number}', f'#{number}')
  22. issues = requests.get(f'{BASE_URL}/issues?milestone={milestone_number}&state=all', timeout=5).json()
  23. notes: Dict[str, List[str]] = {
  24. 'New features and enhancements': [],
  25. 'Bugfixes': [],
  26. 'Documentation': [],
  27. 'Others': [],
  28. }
  29. for issue in issues:
  30. title: str = issue['title']
  31. user: str = issue['user']['login']
  32. body: str = issue['body'] or ''
  33. labels: list[str] = [label['name'] for label in issue['labels']]
  34. number_patterns = [r'#(\d+)', r'https://github.com/zauberzeug/nicegui/(?:issues|discussions|pulls)/(\d+)']
  35. numbers = [issue['number']] + [int(match) for pattern in number_patterns for match in re.findall(pattern, body)]
  36. numbers_str = ', '.join(link(number) for number in sorted(numbers))
  37. note = f'{title.strip()} ({numbers_str} by @{user})'
  38. if 'bug' in labels:
  39. notes['Bugfixes'].append(note)
  40. elif 'enhancement' in labels:
  41. notes['New features and enhancements'].append(note)
  42. elif 'documentation' in labels:
  43. notes['Documentation'].append(note)
  44. else:
  45. notes['Others'].append(note)
  46. for title, lines in notes.items():
  47. if not lines:
  48. continue
  49. print(f'### {title}')
  50. print()
  51. for line in lines:
  52. print(f'- {line}')
  53. print()