From e4c31b34667443705bee6b2a9160c56802ee846b Mon Sep 17 00:00:00 2001 From: Nanda Scott Date: Sun, 28 Oct 2018 01:59:20 -0400 Subject: [PATCH] Sorry for breaking my promise --- gen_docs.py | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 gen_docs.py diff --git a/gen_docs.py b/gen_docs.py new file mode 100644 index 0000000..df65acf --- /dev/null +++ b/gen_docs.py @@ -0,0 +1,117 @@ +import sys +import scrython +import re +from scrython.bulk_data import * +from scrython.cards import * +from scrython.catalog import * +from scrython.rulings import * +from scrython.sets import * +from scrython.symbology import * +from types import FunctionType + +def format_args(string, f): + f.write('\n## Args\n\n|arg|type|description|\n|:---:|:---:|:---:|\n') + + arg_list = re.findall(r'(\w*\s*\(\w+[,\s\w]{1,}\):[\w\s\'\\`,.]*[^\w\s\(])', string) + + for arg in arg_list: + arg_name = re.findall(r'[^\s]*', arg)[0] + + description = re.findall(r'(?<=:\s)(.*)', arg)[0] + + type_and_optional = re.findall(r'(?<=\()\w+[,\s\w]+(?=\))', arg)[0] + + if len(type_and_optional) > 1: + f.write('|{}|{}|{}|\n'.format(arg_name, type_and_optional, description)) + + else: + f.write('|{}|{}|{}|\n'.format(arg_name, type_and_optional, description)) + +def format_returns(string, f): + f.write('\n## Returns\n{}\n'.format(string.strip())) + +def format_raises(string, f): + + if string == 'N/A': + f.write('\n## Raises\n\nN/A') + return + + f.write('\n## Raises\n\n|exception type|reason|\n|:---:|:---:|\n') + + exception_list = re.findall(r'\w+:[\w\s\\\']+[^\s\w:]', string) + + for exception in exception_list: + exception_name = re.findall(r'[^:]*', exception)[0] + + exception_description = re.findall(r'(?<=:\s)([\w\s\.\'\\]*)', exception)[0] + + f.write('|{}|{}|\n'.format(exception_name, exception_description)) + +def format_examples(string, f): + + example_list = re.findall(r'>{3}[\s\w=.("+:,)]+', string) + + f.write('\n## Examples\n') + f.write('```python\n{}\n```\n'.format('\n'.join(example_list))) + +def format_functions(_class, function_list, f): + + f.write('\n## Methods\n') + + for function in function_list: + function_docstring = getattr(eval(_class), function).__doc__ + + f.write('\n---\n### `{}()`\n'.format(getattr(eval(_class), function).__name__)) + + f.write('\n```\n{}\n```'.format(function_docstring)) + +def main(subpackage): + for _class in subpackage.__all__: + + intro = """ +These docs will likely not be as detailed as the official Scryfall Documentation, and you should reference that for more information. + +>In the event that a key isn't found or has been changed, you can access the full JSON output with the `scryfallJson` variable (`{}().scryfallJson`). +""".format(eval(_class).__name__) + + class_docstring = repr(re.sub(r'\n+', '', eval(_class).__doc__)) # removes newlines + + remove_extra_spaces = re.sub(' +', ' ', class_docstring) + + try: + args = re.findall(r'(?<=Args:)(.*)(?=Returns:)', remove_extra_spaces)[0] + + returns = re.findall(r'(?<=Returns:)(.*)(?=Raises:)', remove_extra_spaces)[0] + + raises = re.findall(r'(?<=Raises:)(.*)(?=Examples:)', remove_extra_spaces)[0] + + examples = re.findall(r'(?<=Examples:)(.*)', remove_extra_spaces)[0] + + functions = [x for x in dir(eval(_class)) if not x.startswith('_')] + + with open('./docs/{}/{}.md'.format(subpackage.__name__, _class), 'w') as f: + f.write('# **class** `{}.{}()`\n'.format(subpackage.__name__, _class)) + f.write(intro) + format_args(args, f) + format_returns(returns, f) + format_raises(raises, f) + format_examples(examples, f) + format_functions(_class, functions, f) + + except Exception as e: + print(_class.upper()) + print(repr(eval(_class).__doc__)) + print('Args: ', re.findall(r'(?<=Args:)(.*)(?=Returns:)', remove_extra_spaces)) + print('Returns: ', re.findall(r'(?<=Returns:)(.*)(?=Raises:)', remove_extra_spaces)) + print('Raises: ', re.findall(r'(?<=Raises:)(.*)(?=Examples:)', remove_extra_spaces)) + print('Examples: ', re.findall(r'(?<=Examples:)(.*)', remove_extra_spaces)) + print(e) + print('~~~~~~~~~~~~~~~~~~~~~~~~~~') + +if __name__ == '__main__': + main(scrython.bulk_data) + main(scrython.cards) + main(scrython.catalog) + main(scrython.rulings) + main(scrython.sets) + main(scrython.symbology) \ No newline at end of file