You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sphinx-autoapi/autoapi/extension.py

123 lines
4.5 KiB
Python

10 years ago
# -*- coding: utf-8 -*-
"""
Sphinx Auto-API
"""
import os
import yaml
import fnmatch
10 years ago
import shutil
10 years ago
from collections import defaultdict
from sphinx.util.osutil import ensuredir
from sphinx.util.console import bold, darkgreen
10 years ago
from .utils import classify
# from .dotnet import DotNetNamespace
from epyparse import parsed
def ignore_file(app, filename):
for pat in app.config.autoapi_ignore:
if fnmatch.fnmatch(filename, pat):
return True
return False
10 years ago
def load_yaml(app):
if not app.config.autoapi_dir:
print "You must configure an autodapi_dir setting."
10 years ago
return
app.env.autoapi_data = []
namespaces = defaultdict(list)
if app.config.autoapi_type == 'dotnet':
print "Reading Autodoc Yaml"
# Load Yaml
files_to_read = os.listdir(app.config.autoapi_dir)
for _file in app.status_iterator(
files_to_read, '[AutoAPI] Reading files... ', darkgreen, len(files_to_read)):
# print "Loading Yaml from %s" % _file
10 years ago
to_open = os.path.join(app.config.autoapi_dir, _file)
yaml_obj = yaml.safe_load(open(to_open, 'r'))
app.env.autoapi_data.append(classify(yaml_obj, 'dotnet'))
# print "Sorting objects"
# Sort objects
# for obj in app.env.autoapi_data:
# obj_name = obj['qualifiedName']['CSharp']
# namespace = obj_name.split('.')[0]
# namespaces[namespace].append(classify(obj, 'dotnet'))
10 years ago
# rst = parse(obj, 'dotnet')
# if rst:
# path = os.path.join(app.config.autoapi_root, '%s%s' % (obj['name']['CSharp'], app.config.source_suffix[0]))
# ensuredir(app.config.autoapi_root)
# with open(path, 'w+') as fp:
# fp.write(rst)
print "Generating RST"
# Generate RST
# for namespace, objs in namespaces.items():
for obj in app.env.autoapi_data:
# path = os.path.join(app.config.autoapi_root, '%s%s' % (namespace, app.config.source_suffix[0]))
# namespace_obj = DotNetNamespace(namespace, objs)
# ensuredir(app.config.autoapi_root)
# with open(path, 'w+') as index_file:
# namespace_rst = namespace_obj.render()
# if namespace_rst:
# index_file.write(namespace_rst)
# for obj in objs:
rst = obj.render()
# Detail
detail_dir = os.path.join(app.config.autoapi_root, obj.obj['type'])
ensuredir(detail_dir)
path = os.path.join(detail_dir, '%s%s' % (obj.obj['name']['CSharp'], app.config.source_suffix[0]))
if rst:
with open(path, 'w+') as detail_file:
detail_file.write(rst)
elif app.config.autoapi_type == 'python':
for root, dirnames, filenames in os.walk(app.config.autoapi_dir):
for filename in fnmatch.filter(filenames, u'*.py'):
to_open = os.path.join(root, filename)
if ignore_file(app, to_open):
continue
# print "Parsing Python File from %s" % to_open
try:
parsed_data = parsed(to_open)
app.env.autoapi_data.append(parsed_data)
except Exception:
print "Exception, Keeping going: %s" % to_open
10 years ago
import traceback
traceback.print_exc()
app.env.autoapi_enabled = True
# Generate RST
for obj in app.env.autoapi_data:
# print "Parsing %s" % obj['fullname']
rst = classify(obj, 'python').render()
if rst:
path = os.path.join(app.config.autoapi_root, '%s%s' % (obj['fullname'], app.config.source_suffix[0]))
ensuredir(app.config.autoapi_root)
with open(path, 'w+') as fp:
fp.write(rst.encode('utf8'))
10 years ago
10 years ago
def build_finished(app, exception):
if not app.config.autoapi_keep_files:
if app.verbosity > 1:
print "Cleaning autoapi out"
shutil.rmtree(app.config.autoapi_root)
10 years ago
def setup(app):
app.connect('builder-inited', load_yaml)
10 years ago
app.connect('build-finished', build_finished)
app.add_config_value('autoapi_type', 'dotnet', 'html')
10 years ago
app.add_config_value('autoapi_root', 'autoapi', 'html')
app.add_config_value('autoapi_ignore', ['*migrations*'], 'html')
app.add_config_value('autoapi_dir', '', 'html')
10 years ago
app.add_config_value('autoapi_keep_files', True, 'html')