18
18
import argparse
19
19
from contextlib import contextmanager
20
20
import jinja2
21
+ import webbrowser
21
22
22
23
23
24
DOC_PATH = os .path .dirname (os .path .abspath (__file__ ))
26
27
BUILD_DIRS = ['doctrees' , 'html' , 'latex' , 'plots' , '_static' , '_templates' ]
27
28
28
29
29
- def _generate_index (include_api , single_doc = None ):
30
+ def _generate_index (include_api = True , single_doc = None ):
30
31
"""Create index.rst file with the specified sections.
31
32
32
33
Parameters
@@ -48,6 +49,37 @@ def _generate_index(include_api, single_doc=None):
48
49
single_doc = single_doc ))
49
50
50
51
52
+ def _generate_exclude_pattern (include_api = True , single_doc = None ):
53
+
54
+ if not include_api :
55
+ rst_files = ['api.rst' , 'generated/*.rst' ]
56
+ elif single_doc is not None :
57
+ rst_files = [f for f in os .listdir (SOURCE_PATH )
58
+ if ((f .endswith ('.rst' ) or f .endswith ('.ipynb' ))
59
+ and (f != 'index.rst' ) and (f != single_doc ))]
60
+ rst_files += ['generated/*.rst' ]
61
+ else :
62
+ rst_files = []
63
+
64
+ exclude_patterns = "," .join (
65
+ ['{!r}' .format (i ) for i in ['**.ipynb_checkpoints' ] + rst_files ])
66
+
67
+ return exclude_patterns
68
+
69
+
70
+ def _write_temp_file (classtype , module , function ):
71
+
72
+ s = """{1}.{2}
73
+ =================================
74
+
75
+ .. currentmodule:: {1}
76
+
77
+ .. auto{0}:: {2}""" .format (classtype , module , function )
78
+
79
+ with open (os .path .join (SOURCE_PATH , "temp.rst" ), 'w' ) as f :
80
+ f .write (s )
81
+
82
+
51
83
@contextmanager
52
84
def _maybe_exclude_notebooks ():
53
85
"""Skip building the notebooks if pandoc is not installed.
@@ -96,8 +128,9 @@ class DocBuilder:
96
128
All public methods of this class can be called as parameters of the
97
129
script.
98
130
"""
99
- def __init__ (self , num_jobs = 1 ):
131
+ def __init__ (self , num_jobs = 1 , exclude_patterns = None ):
100
132
self .num_jobs = num_jobs
133
+ self .exclude_patterns = exclude_patterns
101
134
102
135
@staticmethod
103
136
def _create_build_structure ():
@@ -142,8 +175,8 @@ def _sphinx_build(self, kind):
142
175
self ._run_os ('sphinx-build' ,
143
176
'-j{}' .format (self .num_jobs ),
144
177
'-b{}' .format (kind ),
145
- '-d{}' .format (os .path .join (BUILD_PATH ,
146
- 'doctrees' )),
178
+ '-d{}' .format (os .path .join (BUILD_PATH , 'doctrees' )),
179
+ # TODO integrate exclude_patterns
147
180
SOURCE_PATH ,
148
181
os .path .join (BUILD_PATH , kind ))
149
182
@@ -199,6 +232,23 @@ def zip_html(self):
199
232
'-q' ,
200
233
* fnames )
201
234
235
+ def build_docstring (self ):
236
+ """Build single docstring page"""
237
+ self ._create_build_structure ()
238
+
239
+ args = ('sphinx-build' ,
240
+ '-bhtml' ,
241
+ '-d{}' .format (os .path .join (BUILD_PATH , 'doctrees' )),
242
+ '-Dexclude_patterns={}' .format (self .exclude_patterns ),
243
+ SOURCE_PATH ,
244
+ os .path .join (BUILD_PATH , 'html' ),
245
+ os .path .join (SOURCE_PATH , 'temp.rst' )
246
+ )
247
+ # for some reason it does not work with run_os, but it does if I
248
+ # directly call the joined command
249
+ # self._run_os(*args)
250
+ os .system (" " .join (args ))
251
+
202
252
203
253
def main ():
204
254
cmds = [method for method in dir (DocBuilder ) if not method .startswith ('_' )]
@@ -228,15 +278,34 @@ def main():
228
278
type = str ,
229
279
default = os .path .join (DOC_PATH , '..' ),
230
280
help = 'path' )
281
+ argparser .add_argument ('--docstring' ,
282
+ metavar = 'FILENAME' ,
283
+ type = str ,
284
+ default = None ,
285
+ help = ('method or function name to compile, '
286
+ 'e.g. "DataFrame.join"' ))
231
287
args = argparser .parse_args ()
232
288
233
289
if args .command not in cmds :
234
290
raise ValueError ('Unknown command {}. Available options: {}' .format (
235
291
args .command , ', ' .join (cmds )))
236
292
237
293
os .environ ['PYTHONPATH' ] = args .python_path
238
- _generate_index (not args .no_api , args .single )
239
- getattr (DocBuilder (args .num_jobs ), args .command )()
294
+
295
+ if args .docstring is not None :
296
+ _write_temp_file ('method' , 'pandas' , args .docstring )
297
+ exclude_patterns = _generate_exclude_pattern (single_doc = 'temp.rst' )
298
+ _generate_index (single_doc = 'temp.rst' )
299
+ DocBuilder (args .num_jobs , exclude_patterns ).build_docstring ()
300
+ url = "file://" + os .getcwd () + "/build/html/temp.html"
301
+ webbrowser .open (url , new = 2 )
302
+ os .remove ('source/temp.rst' )
303
+
304
+ else :
305
+ _generate_index (not args .no_api , args .single )
306
+ exclude_patterns = _generate_exclude_pattern (
307
+ not args .no_api , args .single )
308
+ getattr (DocBuilder (args .num_jobs , exclude_patterns ), args .command )()
240
309
241
310
242
311
if __name__ == '__main__' :
0 commit comments