import sys import requests from urllib.parse import urlparse WEBSITE_REPOS = [ "erpnext_com", "frappe_io", ] DOCUMENTATION_DOMAINS = [ "docs.erpnext.com", "frappeframework.com", ] def is_valid_url(url: str) -> bool: parts = urlparse(url) return all((parts.scheme, parts.netloc, parts.path)) def is_documentation_link(word: str) -> bool: if not word.startswith("http") or not is_valid_url(word): return False parsed_url = urlparse(word) if parsed_url.netloc in DOCUMENTATION_DOMAINS: return True if parsed_url.netloc == "github.com": parts = parsed_url.path.split("/") if len(parts) == 5 and parts[1] == "frappe" and parts[2] in WEBSITE_REPOS: return True return False def contains_documentation_link(body: str) -> bool: return any( is_documentation_link(word) for line in body.splitlines() for word in line.split() ) def check_pull_request(number: str) -> "tuple[int, str]": response = requests.get(f"https://api.github.com/repos/frappe/erpnext/pulls/{number}") if not response.ok: return 1, "Pull Request Not Found! ⚠️" payload = response.json() title = (payload.get("title") or "").lower().strip() head_sha = (payload.get("head") or {}).get("sha") body = (payload.get("body") or "").lower() if ( not title.startswith("feat") or not head_sha or "no-docs" in body or "backport" in body ): return 0, "Skipping documentation checks... 🏃" if contains_documentation_link(body): return 0, "Documentation Link Found. You're Awesome! 🎉" return 1, "Documentation Link Not Found! ⚠️" if __name__ == "__main__": exit_code, message = check_pull_request(sys.argv[1]) print(message) sys.exit(exit_code)