#!/usr/bin/env python import os import sys import json import argparse import awscli.clidriver from awscli.help import PagingHelpRenderer REF_PATH = 'reference' TUT_PATH = 'tutorial' TOPIC_PATH = 'topic' class FileRenderer(PagingHelpRenderer): def __init__(self, file_path): self._file_path = file_path def render(self, contents): fp = open(self._file_path, 'wb') fp.write(contents) fp.close() def do_operation(driver, service_path, operation_name, operation_command): file_path = os.path.join(service_path, operation_name + '.rst') help_command = operation_command.create_help_command() if help_command is None: # Do not document anything that does not have a help command. return help_command.doc.target = 'html' help_command.renderer = FileRenderer(file_path) help_command(None, None) def do_service(driver, ref_path, service_name, service_command, is_top_level_service=True): if is_top_level_service: print('...%s' % service_name) service_path = os.path.join(ref_path, service_name) if not os.path.isdir(service_path): os.mkdir(service_path) index_path = os.path.join(service_path, 'index.rst') help_command = service_command.create_help_command() if help_command is None: # Do not document anything that does not have a help command. return help_command.doc.target = 'html' help_command.renderer = FileRenderer(index_path) help_command(None, None) for operation_name in help_command.command_table: if operation_name == 'help': continue operation_command = help_command.command_table[operation_name] subcommand_table = getattr(operation_command, 'subcommand_table', {}) # If the operation command has a subcommand table with commands # in it, treat it as a service command as opposed to an operation # command. if (len(subcommand_table) > 0): do_service(driver, service_path, operation_name, operation_command, False) else: do_operation(driver, service_path, operation_name, operation_command) def do_topic(driver, topic_path, topic_help_command): print('...%s' % topic_help_command.name) file_path = os.path.join(topic_path, topic_help_command.name + '.rst') topic_help_command.doc.target = 'html' topic_help_command.renderer = FileRenderer(file_path) topic_help_command(None, None) def do_provider(driver): help_command = driver.create_help_command() help_command.doc.target = 'html' help_command.renderer = FileRenderer(os.path.join(REF_PATH, 'index.rst')) help_command(None, None) topic_help_command = help_command.subcommand_table['topics'] topic_help_command.renderer = FileRenderer(os.path.join(TOPIC_PATH, 'index.rst')) topic_help_command.doc.target = 'html' help_command(['topics'], None) topics = help_command.subcommand_table print('Writing topics:') for topic in topics: if topic == 'topics': continue topic_help_command = help_command.subcommand_table[topic] do_topic(driver, TOPIC_PATH, topic_help_command) services = sorted(help_command.command_table) print('\nWriting service references') for service_name in services: if service_name == 'help': continue service_command = help_command.command_table[service_name] do_service(driver, REF_PATH, service_name, service_command) def build_service_list(tut_path, ref_path, driver): file_path = os.path.join(tut_path, 'services.rst') fp = open(file_path, 'w') fp.write('\n') l = [] help_command = driver.create_help_command() for service_name in help_command.command_table: if service_name == 'help': continue service_command = help_command.command_table[service_name] if not hasattr(service_command, '_service_object'): continue service = service_command._service_object l.append((service.service_full_name, service_name)) l = sorted(l, key=lambda x: x[1]) for full_name, service_name in l: service_ref_path = os.path.join(ref_path, service_name) service_ref_path = os.path.join(service_ref_path, 'index') fp.write('* :doc:`%s <..%s%s>`\n' % (full_name, os.path.sep, service_ref_path)) fp.write('\n') fp.close() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-s', '--service', help='Name of service, or else all services') parser.add_argument('-o', '--operations', help='Name of operations, or else all operations', nargs='*') args = parser.parse_args() driver = awscli.clidriver.create_clidriver() if not os.path.isdir(REF_PATH): os.mkdir(REF_PATH) if not os.path.isdir(TUT_PATH): os.mkdir(TUT_PATH) if not os.path.isdir(TOPIC_PATH): os.mkdir(TOPIC_PATH) print('Generating ReST documents for all services...') do_provider(driver) print('Generating service list ReST document...') build_service_list(TUT_PATH, REF_PATH, driver) print('Done!')