#!/usr/bin/env python # -*- coding: utf-8 -*- # ########################## Copyrights and license ############################ # # # Copyright 2013 Vincent Jacques # # # # This file is part of PyGithub. # # http://pygithub.github.io/PyGithub/v1/index.html # # # # PyGithub is free software: you can redistribute it and/or modify it under # # the terms of the GNU Lesser General Public License as published by the Free # # Software Foundation, either version 3 of the License, or (at your option) # # any later version. # # # # PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY # # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # # details. # # # # You should have received a copy of the GNU Lesser General Public License # # along with PyGithub. If not, see . # # # # ############################################################################## import os import fnmatch import glob # @todo Check links from our doc to Github API v3 ref # - in the description of each class # - in each ":calls:" section def parseReference(): badlyNamedUrls = { ("/gitignore/templates/C", "GET"): ("/gitignore/templates/:name", "GET"), ("/notifications/threads/1/subscription", "DELETE"): ("/notifications/threads/:id/subscription", "DELETE"), ("/notifications/threads/1/subscription", "GET"): ("/notifications/threads/:id/subscription", "GET"), ("/notifications/threads/1/subscription", "PUT"): ("/notifications/threads/:id/subscription", "PUT"), } undocumentedUrls = [ ("/hooks/:name", "GET"), # Discovered in https://github.com/jacquev6/PyGithub/issues/196 ("/hooks", "GET"), # Mentioned somewhere in http://developer.github.com/v3/repos/hooks/ ("/hub", "POST"), # Described in content/v3/repos/hooks.md ("/api/status.json", "GET"), # https://status.github.com/api ("/api/last-message.json", "GET"), # https://status.github.com/api ("/api/messages.json", "GET"), # https://status.github.com/api ] uninterestingUrls = [ ("/markdown/raw", "POST"), # Job is done by /markdown => useless in PyGithub ("/repos/octocat/Hello-World/git/refs/heads/feature-a", "DELETE"), # Example of DELETE /repos/:owner/:repo/git/refs/:ref ("/repos/octocat/Hello-World/git/refs/tags/v1.0", "DELETE"), # Example of DELETE /repos/:owner/:repo/git/refs/:ref ("/repos/:owner/:repo/git/trees/:sha?recursive=1", "GET"), # Example of GET /repos/:owner/:repo/git/trees/:sha ("/repos/:owner/:repo/git/refs/heads/skunkworkz/featureA", "GET"), # Example of GET /repos/:owner/:repo/git/refs ("/repos/:owner/:repo/git/refs/tags", "GET"), # Example of GET /repos/:owner/:repo/git/refs ] urls = dict() for root, _, filenames in os.walk('developer.github.com'): for filename in fnmatch.filter(filenames, '*.md'): filename = os.path.join(root, filename) with open(filename) as f: for line in f: if line.startswith("#"): section = ("-".join(line.rstrip().split(" ")[1:])) # ## @todo anchor-ify (lowercase, only a-z, etc.) if line.startswith(" "): line = line[4:] if line.startswith("\t"): line = line[1:] for v in ["GET", "PATCH", "DELETE", "POST", "PUT"]: if line.startswith(v + " /"): verb, url = line.strip().split(" ") url = (url, verb) if url in badlyNamedUrls: url = badlyNamedUrls[url] docUrl = "http://developer.github.com/" + filename[29:-3] # ## @todo + "#" + section urls[url] = docUrl for url in undocumentedUrls: urls[url] = None for url in uninterestingUrls: del urls[url] return urls def parseLibrary(): urls = dict() for filename in glob.glob("github/*.py"): with open(filename) as f: for line in f: if line.startswith(" :calls:"): line = line[17:-3] for part in line.split("`_ or `"): verb, apiUrl, docUrl = part.split(" ") docUrl = docUrl[1:-1] urls[(apiUrl, verb)] = docUrl return urls def printUrls(title, urls): if len(urls) > 0: print len(urls), "URLs", title + ":" print " ", "\n ".join(url + " (" + verb + ")" for url, verb in sorted(urls)) print def main(): ref = parseReference() lib = parseLibrary() printUrls("in Github API v3, but not implemented in PyGithub", set(ref) - set(lib)) printUrls("called by PyGithub but not existing in Github API v3", set(lib) - set(ref)) for key in set(lib) & set(ref): (url, verb) = key if ref[key] is not None and lib[key] != ref[key] and not lib[key].startswith(ref[key] + "/#"): print "sed -i \"s@:calls: ." + verb + " " + url + " ." + lib[key] + ".._" + "@:calls: \\`" + verb + " " + url + " \\<" + ref[key] + "\\>\\`_@\" github/*.py" if __name__ == "__main__": main()