-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathgen_docs.py
131 lines (89 loc) · 4.39 KB
/
gen_docs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import sys
import scrython
import re
import os
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 'N/A' in string:
f.write('\n## Raises\nN/A\n')
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('_')]
if not os.path.exists('./docs/{}'.format(subpackage.__name__)):
os.makedirs('./docs/{}'.format(subpackage.__name__))
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__':
from scrython.bulk_data import *
main(scrython.bulk_data)
del scrython.bulk_data
from scrython.cards import *
main(scrython.cards)
del scrython.cards
from scrython.catalog import *
main(scrython.catalog)
del scrython.catalog
from scrython.rulings import *
main(scrython.rulings)
del scrython.rulings
from scrython.sets import *
main(scrython.sets)
del scrython.sets
from scrython.symbology import *
main(scrython.symbology)
del scrython.symbology