documentation/api/source/scan.py

129 lines
3.7 KiB
Python
Executable File

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import shutil
from modulefinder import ModuleFinder
import pkgutil
import string
import multiprocessing
from queue import Empty
PACKAGE_RST = string.Template("""$underline
$title
$underline
.. toctree::
:glob:
:maxdepth: 2
$title/*
.. automodule:: $module
""")
MODULE_RST = string.Template("""$underline
$title
$underline
.. automodule:: $module
$exclude""")
def find_modules(importer, module, package):
if module.startswith('openlp'):
title = str(module.split('.')[-1])
underline = str(len(title) * '=')
values = {'underline': underline, 'title': title, 'module': module}
path = os.path.join(find_modules.root_path, module.replace('.', os.path.sep) + '.rst')
base_path = os.path.basename(path)
if not os.path.exists(base_path):
os.makedirs(base_path, 0o755)
if package:
with open(os.path.join(path), 'w+') as file:
file.write(PACKAGE_RST.substitute(values))
else:
finder = ModuleFinder()
exclude = ''
try:
finder.run_script(os.path.join(importer.path, title + '.py'))
except ImportError:
print('Failed to import {0}{1}'.format(module, ' '*25))
raise
except Exception:
print('Failed in module {0}'.format(module))
raise
for name in finder.modules.keys():
if name.startswith('sqlalchemy'):
exclude = " :exclude-members: mapper, or_, and_\n"
values['exclude'] = exclude
with open(os.path.join(path), 'w+') as file:
file.write(MODULE_RST.substitute(values))
find_modules.queue.put(module)
def find_modules_init(queue, root_path):
find_modules.queue = queue
find_modules.root_path = root_path
def progress(queue, number):
progress_percentage = 0
while number > progress_percentage:
try:
module = queue.get(True, 5)
except Empty:
break
percent = round((progress_percentage/number)*100)
sys.stdout.write('{0}% File: {1}{2}\r'.format(percent, module, ' '*25))
sys.stdout.flush()
progress_percentage += 1
sys.stdout.write('100%{0}\n'.format(' '*50))
sys.stdout.flush()
def main():
modules = []
if 'OPENLP_SOURCE' in os.environ:
path_to_code = os.path.abspath(os.environ['OPENLP_SOURCE'])
else:
path_to_code = os.path.abspath(os.path.join(os.path.split(__file__)[0],
'..', '..', '..', '..', 'openlp', 'trunk'))
if not os.path.exists(path_to_code):
print('Incorrect path to code, expecting "%s"' % path_to_code)
sys.exit(1)
root_path = os.path.abspath(os.path.join(os.path.split(__file__)[0], 'api'))
sys.path.insert(0, path_to_code)
if os.path.isdir(root_path):
shutil.rmtree(root_path)
os.makedirs(root_path)
pkg = pkgutil.walk_packages([path_to_code], onerror=print)
for importer, module, package in pkg:
if module.startswith('openlp') and not module.endswith(('vendor', 'vlc')):
path = os.path.join(root_path, module.replace('.', os.path.sep))
if package:
if not os.path.exists(path):
os.makedirs(path)
modules.append([importer, module, package])
del sys.path[0]
queue = multiprocessing.Queue()
thread = multiprocessing.Process(target=progress, args=(queue, len(modules)))
thread.start()
pool = multiprocessing.Pool(None, find_modules_init, [queue, root_path])
pool.starmap(find_modules, modules)
pool.close()
if __name__ == '__main__':
main()