fetch_milestone.py 1.9 KB

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