#!/usr/bin/env python3 import requests import mwparserfromhell import yaml import os import sys def update_files(*filenames): blocklabels = { yaml.safe_load(open(filename))['label']: filename for filename in filenames } pages = requests.get( 'https://wiki.gnuradio.org/api.php', params={ 'action': 'query', 'format': 'json', 'prop': 'revisions', 'rvprop': 'content', 'titles': '|'.join((blocklabel.replace(' ', '_') for blocklabel in blocklabels)) } ).json() pages = { page['title']: page['revisions'][0]['*'] for page in pages['query']['pages'].values() if 'revisions' in page } for blocklabel, filename in blocklabels.items(): if blocklabel not in pages: print('Not found on wiki:', blocklabel) continue print(filename, blocklabel) page = pages[blocklabel] page = mwparserfromhell.parse(page) sections = page.get_sections(matches='Parameters', include_lead=True) sections = (section.strip_code() for section in sections) doc = '\n\n'.join(sections) block_lines = [*open(filename)] replaced_doc = False old_doc_start = -1 if block_lines[-1].rstrip() == 'file_format: 1' else len(block_lines) for index, line in enumerate(block_lines): if line.startswith('documentation:'): old_doc_start = index break old_doc_end = old_doc_start for index, line in enumerate(block_lines[old_doc_start:]): if not line.startswith(' ') and line.strip() and not line.startswith('documentation'): old_doc_end = index + old_doc_start break doc_lines = ['documentation: |-\n', *[' ' + line.strip() + '\n' for line in doc.split('\n')], '\n'] block_lines[old_doc_start:old_doc_end] = doc_lines open(filename, 'w').write(''.join(block_lines)) if __name__ == '__main__': if sys.argv[1:]: update_files(*sys.argv[1:]) else: files = [] for root, dirs, files in os.walk("."): files = [os.path.join(root, file) for file in files if file.endswith('.block.yml')] if files: update_files(*files)