diff options
Diffstat (limited to 'gr-utils/modtool/templates/gr-newmod/docs/doxygen/update_pydoc.py')
-rw-r--r-- | gr-utils/modtool/templates/gr-newmod/docs/doxygen/update_pydoc.py | 104 |
1 files changed, 68 insertions, 36 deletions
diff --git a/gr-utils/modtool/templates/gr-newmod/docs/doxygen/update_pydoc.py b/gr-utils/modtool/templates/gr-newmod/docs/doxygen/update_pydoc.py index dd2fba79f2..b65e168ae5 100644 --- a/gr-utils/modtool/templates/gr-newmod/docs/doxygen/update_pydoc.py +++ b/gr-utils/modtool/templates/gr-newmod/docs/doxygen/update_pydoc.py @@ -16,16 +16,23 @@ python docstrings. """ -import os, sys, time, glob, re, json +import os +import sys +import time +import glob +import re +import json from argparse import ArgumentParser from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile from doxyxml import DoxyOther, base + def py_name(name): bits = name.split('_') return '_'.join(bits[1:]) + def make_name(name): bits = name.split('_') return bits[0] + '_make_' + '_'.join(bits[1:]) @@ -50,6 +57,7 @@ class Block(object): is_a_block = di.has_member(friendname, DoxyFunction) return is_a_block + class Block2(object): """ Checks if doxyxml produced objects correspond to a new style @@ -63,7 +71,8 @@ class Block2(object): # Check for a parsing error. if item.error(): return False - is_a_block2 = item.has_member('make', DoxyFunction) and item.has_member('sptr', DoxyOther) + is_a_block2 = item.has_member( + 'make', DoxyFunction) and item.has_member('sptr', DoxyOther) return is_a_block2 @@ -94,6 +103,7 @@ def combine_descriptions(obj): description.append(dd) return utoascii('\n\n'.join(description)).strip() + def format_params(parameteritems): output = ['Args:'] template = ' {0} : {1}' @@ -101,7 +111,10 @@ def format_params(parameteritems): output.append(template.format(pi.name, pi.description)) return '\n'.join(output) + entry_templ = '%feature("docstring") {name} "{docstring}"' + + def make_entry(obj, name=None, templ="{description}", description=None, params=[]): """ Create a docstring key/value pair, where the key is the object name. @@ -114,9 +127,9 @@ def make_entry(obj, name=None, templ="{description}", description=None, params=[ used as the description instead of extracting it from obj. """ if name is None: - name=obj.name() - if hasattr(obj,'_parse_data') and hasattr(obj._parse_data,'definition'): - name=obj._parse_data.definition.split(' ')[-1] + name = obj.name() + if hasattr(obj, '_parse_data') and hasattr(obj._parse_data, 'definition'): + name = obj._parse_data.definition.split(' ')[-1] if "operator " in name: return '' if description is None: @@ -174,9 +187,10 @@ def make_block_entry(di, block): output = {} output.update(make_class_entry(block, description=super_description)) output.update(make_entry(make_func, description=super_description, - params=block.params)) + params=block.params)) return output + def make_block2_entry(di, block): """ Create class and function docstrings of a new style gnuradio block @@ -186,19 +200,21 @@ def make_block2_entry(di, block): class_description = combine_descriptions(block) make_func = block.get_member('make', DoxyFunction) make_description = combine_descriptions(make_func) - description = class_description + "\n\nConstructor Specific Documentation:\n\n" + make_description + description = class_description + \ + "\n\nConstructor Specific Documentation:\n\n" + make_description # Associate the combined description with the class and # the make function. output = {} output.update(make_class_entry( - block, description=description, - ignored_methods=['make'], params=make_func.params)) + block, description=description, + ignored_methods=['make'], params=make_func.params)) makename = block.name() + '::make' output.update(make_entry( - make_func, name=makename, description=description, - params=make_func.params)) + make_func, name=makename, description=description, + params=make_func.params)) return output + def get_docstrings_dict(di, custom_output=None): output = {} @@ -218,19 +234,21 @@ def get_docstrings_dict(di, custom_output=None): make_funcs.add(make_func.name()) output.update(make_block_entry(di, block)) except block.ParsingError: - sys.stderr.write('Parsing error for block {0}\n'.format(block.name())) + sys.stderr.write( + 'Parsing error for block {0}\n'.format(block.name())) raise for block in blocks2: try: make_func = block.get_member('make', DoxyFunction) - make_func_name = block.name() +'::make' + make_func_name = block.name() + '::make' # Don't want to risk writing to output twice. if make_func_name not in make_funcs: make_funcs.add(make_func_name) output.update(make_block2_entry(di, block)) except block.ParsingError: - sys.stderr.write('Parsing error for block {0}\n'.format(block.name())) + sys.stderr.write( + 'Parsing error for block {0}\n'.format(block.name())) raise # Create docstrings for functions @@ -241,7 +259,8 @@ def get_docstrings_dict(di, custom_output=None): try: output.update(make_entry(f)) except f.ParsingError: - sys.stderr.write('Parsing error for function {0}\n'.format(f.name())) + sys.stderr.write( + 'Parsing error for function {0}\n'.format(f.name())) # Create docstrings for classes block_names = [block.name() for block in blocks] @@ -259,22 +278,24 @@ def get_docstrings_dict(di, custom_output=None): return output + def sub_docstring_in_pydoc_h(pydoc_files, docstrings_dict, output_dir, filter_str=None): if filter_str: - docstrings_dict = {k: v for k, v in docstrings_dict.items() if k.startswith(filter_str)} + docstrings_dict = { + k: v for k, v in docstrings_dict.items() if k.startswith(filter_str)} - with open(os.path.join(output_dir,'docstring_status'),'w') as status_file: + with open(os.path.join(output_dir, 'docstring_status'), 'w') as status_file: for pydoc_file in pydoc_files: if filter_str: - filter_str2 = "::".join((filter_str,os.path.split(pydoc_file)[-1].split('_pydoc_template.h')[0])) - docstrings_dict2 = {k: v for k, v in docstrings_dict.items() if k.startswith(filter_str2)} + filter_str2 = "::".join((filter_str, os.path.split( + pydoc_file)[-1].split('_pydoc_template.h')[0])) + docstrings_dict2 = { + k: v for k, v in docstrings_dict.items() if k.startswith(filter_str2)} else: docstrings_dict2 = docstrings_dict - - - file_in = open(pydoc_file,'r').read() + file_in = open(pydoc_file, 'r').read() for key, value in docstrings_dict2.items(): file_in_tmp = file_in try: @@ -282,37 +303,44 @@ def sub_docstring_in_pydoc_h(pydoc_files, docstrings_dict, output_dir, filter_st # if 'gr' in doc_key: # doc_key.remove('gr') doc_key = '_'.join(doc_key) - regexp = r'(__doc_{} =\sR\"doc\()[^)]*(\)doc\")'.format(doc_key) + regexp = r'(__doc_{} =\sR\"doc\()[^)]*(\)doc\")'.format( + doc_key) regexp = re.compile(regexp, re.MULTILINE) - (file_in, nsubs) = regexp.subn(r'\1'+value+r'\2', file_in, count=1) + (file_in, nsubs) = regexp.subn( + r'\1' + value + r'\2', file_in, count=1) if nsubs == 1: status_file.write("PASS: " + pydoc_file + "\n") except KeyboardInterrupt: raise KeyboardInterrupt - except: # be permissive, TODO log, but just leave the docstring blank + except: # be permissive, TODO log, but just leave the docstring blank status_file.write("FAIL: " + pydoc_file + "\n") file_in = file_in_tmp - output_pathname = os.path.join(output_dir, os.path.basename(pydoc_file).replace('_template.h','.h')) - with open(output_pathname,'w') as file_out: + output_pathname = os.path.join(output_dir, os.path.basename( + pydoc_file).replace('_template.h', '.h')) + with open(output_pathname, 'w') as file_out: file_out.write(file_in) + def copy_docstring_templates(pydoc_files, output_dir): - with open(os.path.join(output_dir,'docstring_status'),'w') as status_file: + with open(os.path.join(output_dir, 'docstring_status'), 'w') as status_file: for pydoc_file in pydoc_files: - file_in = open(pydoc_file,'r').read() - output_pathname = os.path.join(output_dir, os.path.basename(pydoc_file).replace('_template.h','.h')) - with open(output_pathname,'w') as file_out: + file_in = open(pydoc_file, 'r').read() + output_pathname = os.path.join(output_dir, os.path.basename( + pydoc_file).replace('_template.h', '.h')) + with open(output_pathname, 'w') as file_out: file_out.write(file_in) status_file.write("DONE") + def argParse(): """Parses commandline args.""" - desc='Scrape the doxygen generated xml for docstrings to insert into python bindings' + desc = 'Scrape the doxygen generated xml for docstrings to insert into python bindings' parser = ArgumentParser(description=desc) - parser.add_argument("function", help="Operation to perform on docstrings", choices=["scrape","sub","copy"]) + parser.add_argument("function", help="Operation to perform on docstrings", choices=[ + "scrape", "sub", "copy"]) parser.add_argument("--xml_path") parser.add_argument("--bindings_dir") @@ -322,6 +350,7 @@ def argParse(): return parser.parse_args() + if __name__ == "__main__": # Parse command line options and set up doxyxml. args = argParse() @@ -333,8 +362,11 @@ if __name__ == "__main__": elif args.function.lower() == 'sub': with open(args.json_path, 'r') as fp: docstrings_dict = json.load(fp) - pydoc_files = glob.glob(os.path.join(args.bindings_dir,'*_pydoc_template.h')) - sub_docstring_in_pydoc_h(pydoc_files, docstrings_dict, args.output_dir, args.filter) + pydoc_files = glob.glob(os.path.join( + args.bindings_dir, '*_pydoc_template.h')) + sub_docstring_in_pydoc_h( + pydoc_files, docstrings_dict, args.output_dir, args.filter) elif args.function.lower() == 'copy': - pydoc_files = glob.glob(os.path.join(args.bindings_dir,'*_pydoc_template.h')) + pydoc_files = glob.glob(os.path.join( + args.bindings_dir, '*_pydoc_template.h')) copy_docstring_templates(pydoc_files, args.output_dir) |