github.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. ## @package github
  2. # Module caffe2.python.docs.github
  3. import argparse
  4. import os
  5. from caffe2.python.docs.formatter import Markdown
  6. from caffe2.python.docs.generator import OpDocGenerator, DocUploader
  7. from caffe2.python.docs.generator import OperatorDoc, OperatorEngine
  8. class GHOpDocUploader(DocUploader):
  9. def __init__(self):
  10. pass
  11. def upload(self, content_body):
  12. print(content_body)
  13. class GHMarkdown(Markdown):
  14. def addHeader(self, text, h=1):
  15. self.addLine("\n{header} {text}\n".format(header=h * '#', text=text), True)
  16. def addDocHeader(self):
  17. self.addLine("---")
  18. self.addLine("docid: operators-catalog")
  19. self.addLine("title: Operators Catalog")
  20. self.addLine("layout: operators")
  21. self.addLine("permalink: /docs/operators-catalogue.html")
  22. self.addLine("---")
  23. self.addLine("* TOC")
  24. self.addLine("{:toc}")
  25. def addTable(self, table, noTitle=False):
  26. self.addLinebreak()
  27. assert(len(table) > 1)
  28. self.addLine(' | '.join(['----------' for i in range(len(table[0]))]))
  29. self.addLine(' | '.join(table[0]))
  30. for row in table[1:]:
  31. self.addLine(' | '.join(row))
  32. def addTableHTML(self, table, noTitle=False):
  33. self.addRaw("<table>")
  34. for row in table:
  35. self.addRaw("<tr>")
  36. for cell in row:
  37. self.addRaw("<td>")
  38. self.addLine("{cell}".format(cell=cell))
  39. self.addRaw("</td>")
  40. self.addRaw("</tr>")
  41. self.addRaw("</table>")
  42. def getCodeLink(formatter, schema):
  43. formatter = formatter.clone()
  44. path = os.path.relpath(schema.file, "caffe2")
  45. schemaLink = ('https://github.com/pytorch/pytorch/blob/master/{path}'
  46. .format(path=path))
  47. formatter.addLink('{path}'.format(path=path), schemaLink)
  48. return formatter.dump()
  49. class GHOperatorEngine(OperatorEngine):
  50. def generateDoc(self, formatter):
  51. for device, _ in self.getDeviceImpl():
  52. formatter.addCode('{engine}'.format(engine=self.engine), True)
  53. if device:
  54. formatter.addRaw(' on ')
  55. formatter.addEmphasis("{device}".format(device=device), 1)
  56. class GHOperatorDoc(OperatorDoc):
  57. def generateCodeLink(self, formatter):
  58. formatter.addHeader("Code", 3)
  59. formatter.addLinebreak()
  60. formatter.addRaw(getCodeLink(formatter, self.schema))
  61. def getInfo(self, formatter, name, impl):
  62. formatter = formatter.clone()
  63. if impl:
  64. formatter.addEmphasis('{name}'.format(name=name), 1)
  65. formatter.addRaw(' ')
  66. formatter.addCode('{impl}'.format(impl=impl), True)
  67. return formatter.dump()
  68. def generateSchema(self, formatter):
  69. formatter.addHeader(self.name, 2)
  70. if self.schema:
  71. self.generateDoc(formatter)
  72. self.generateInterface(formatter)
  73. self.generateCodeLink(formatter)
  74. formatter.addBreak()
  75. else:
  76. formatter.addLine("No schema documented yet.")
  77. class GHOpDocGenerator(OpDocGenerator):
  78. def getOperatorDoc(self, name, schema, priority):
  79. return GHOperatorDoc(name, schema, priority)
  80. def getOperatorEngine(self, name):
  81. return GHOperatorEngine(name)
  82. def createBody(self):
  83. self.formatter.addDocHeader()
  84. operators = self.getOperators()
  85. for operator in operators:
  86. operator.generateSchema(self.formatter)
  87. self.content_body += self.formatter.dump()
  88. if __name__ == "__main__":
  89. parser = argparse.ArgumentParser(description="Operators catalog generator.")
  90. parser.add_argument('catalog_path', type=str,
  91. help='operators-catalogue.md to write out to')
  92. args = parser.parse_args()
  93. with open(args.catalog_path, 'w') as fp:
  94. ops = GHOpDocGenerator(GHMarkdown(), GHOpDocUploader)
  95. ops.createBody()
  96. fp.write(ops.content_body)
  97. print("Updated {}!".format(args.catalog_path))