mirror of
https://gitlab.com/openlp/documentation.git
synced 2024-12-22 12:32:48 +00:00
129 lines
3.7 KiB
Python
Executable File
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()
|