## @package github # Module caffe2.python.docs.github import argparse import os from caffe2.python.docs.formatter import Markdown from caffe2.python.docs.generator import OpDocGenerator, DocUploader from caffe2.python.docs.generator import OperatorDoc, OperatorEngine class GHOpDocUploader(DocUploader): def __init__(self): pass def upload(self, content_body): print(content_body) class GHMarkdown(Markdown): def addHeader(self, text, h=1): self.addLine("\n{header} {text}\n".format(header=h * '#', text=text), True) def addDocHeader(self): self.addLine("---") self.addLine("docid: operators-catalog") self.addLine("title: Operators Catalog") self.addLine("layout: operators") self.addLine("permalink: /docs/operators-catalogue.html") self.addLine("---") self.addLine("* TOC") self.addLine("{:toc}") def addTable(self, table, noTitle=False): self.addLinebreak() assert(len(table) > 1) self.addLine(' | '.join(['----------' for i in range(len(table[0]))])) self.addLine(' | '.join(table[0])) for row in table[1:]: self.addLine(' | '.join(row)) def addTableHTML(self, table, noTitle=False): self.addRaw("") for row in table: self.addRaw("") for cell in row: self.addRaw("") self.addRaw("") self.addRaw("
") self.addLine("{cell}".format(cell=cell)) self.addRaw("
") def getCodeLink(formatter, schema): formatter = formatter.clone() path = os.path.relpath(schema.file, "caffe2") schemaLink = ('https://github.com/pytorch/pytorch/blob/master/{path}' .format(path=path)) formatter.addLink('{path}'.format(path=path), schemaLink) return formatter.dump() class GHOperatorEngine(OperatorEngine): def generateDoc(self, formatter): for device, _ in self.getDeviceImpl(): formatter.addCode('{engine}'.format(engine=self.engine), True) if device: formatter.addRaw(' on ') formatter.addEmphasis("{device}".format(device=device), 1) class GHOperatorDoc(OperatorDoc): def generateCodeLink(self, formatter): formatter.addHeader("Code", 3) formatter.addLinebreak() formatter.addRaw(getCodeLink(formatter, self.schema)) def getInfo(self, formatter, name, impl): formatter = formatter.clone() if impl: formatter.addEmphasis('{name}'.format(name=name), 1) formatter.addRaw(' ') formatter.addCode('{impl}'.format(impl=impl), True) return formatter.dump() def generateSchema(self, formatter): formatter.addHeader(self.name, 2) if self.schema: self.generateDoc(formatter) self.generateInterface(formatter) self.generateCodeLink(formatter) formatter.addBreak() else: formatter.addLine("No schema documented yet.") class GHOpDocGenerator(OpDocGenerator): def getOperatorDoc(self, name, schema, priority): return GHOperatorDoc(name, schema, priority) def getOperatorEngine(self, name): return GHOperatorEngine(name) def createBody(self): self.formatter.addDocHeader() operators = self.getOperators() for operator in operators: operator.generateSchema(self.formatter) self.content_body += self.formatter.dump() if __name__ == "__main__": parser = argparse.ArgumentParser(description="Operators catalog generator.") parser.add_argument('catalog_path', type=str, help='operators-catalogue.md to write out to') args = parser.parse_args() with open(args.catalog_path, 'w') as fp: ops = GHOpDocGenerator(GHMarkdown(), GHOpDocUploader) ops.createBody() fp.write(ops.content_body) print("Updated {}!".format(args.catalog_path))