members_check.py (73 lines of code) (raw):

#!/usr/bin/env python3 # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # # # Check contents of members.md to ensure entries are valid ids and in the correct section # Intended to be run by a GitHub Action, but can also be run from a local checkout import sys import requests MEMBER_INFO = 'https://whimsy.apache.org/public/member-info.json' MEMBERS_MD ='content/foundation/members.md' def main(failOnWarn=False): member_info = requests.get(MEMBER_INFO).json() members = member_info['members'] ex_members = member_info['ex_members'] errors = 0 warnings = 0 with open(MEMBERS_MD, 'r', encoding='utf-8') as md: section = None for line in md: if line.startswith('| Id | Name | Projects |'): section = 'members' print("Checking members section") continue elif line.startswith('| Id | Name |'): section = 'emeritus' print("Checking emeritus section") continue elif len(line.strip()) == 0: section = None continue elif line.startswith('|---'): continue if section is None: continue if not line.startswith('| '): print("Unexpected format:") print(line.strip()) errors += 1 parts = line.strip().split('|') parts.pop(0) availid = parts.pop(0).strip() name = parts.pop(0).strip() if section == 'members': if not availid in members: level = '' if availid in ex_members: status = f"is listed in Whimsy with status '{ex_members.get(availid)}'" warnings += 1 level = 'WARNING' else: status = "was not found in Whimsy" errors += 1 level = 'ERROR' print(f"{level}: '{availid}' ({name}) is listed in the 'members' section of `content/foundation/members.md`, but {status}") elif section == 'emeritus': if availid != '?' and not availid in ex_members: if availid in members: status = "is listed in Whimsy as an ASF Member" warnings += 1 level = 'WARNING' else: status = "was not found in Whimsy" errors += 1 level = 'ERROR' print(f"{level}: '{availid}' ({name}) is listed in the 'emeritus' section of `content/foundation/members.md`, but {status}") print(f"Detected {errors} error(s) and {warnings} warnings. ") if errors > 0: print("Errors detected, failing") sys.exit(1) elif warnings > 0: if failOnWarn: print("Warnings detected, failing") sys.exit(1) else: print("Warnings detected") else: print("No errors or warnings detected") if __name__ == '__main__': main(len(sys.argv) >1 and sys.argv[1] == 'failOnWarn')