summaryrefslogtreecommitdiff
path: root/gr-utils/modtool/templates/gr-newmod/docs/doxygen/update_pydoc.py
diff options
context:
space:
mode:
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.py104
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)