scripts/refdoc/generate.py (59 lines of code) (raw):
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
from __future__ import print_function
import os
import sys
import copy
import shutil
import argparse
import tempfile
import datetime
from subprocess import check_call, CalledProcessError
ENV_KEY_AZURE_EXTENSION_DIR = 'AZURE_EXTENSION_DIR'
def print_status(msg=''):
print('-- '+msg)
def generate(ext_file, output_dir):
# Verify sphinx installed in environment before we get started
check_call(['sphinx-build', '--version'])
if not output_dir:
output_dir = tempfile.mkdtemp(prefix='ref-doc-out-', dir=os.getcwd())
print_status('Using output directory {}'.format(output_dir))
temp_extension_dir = tempfile.mkdtemp()
try:
pip_cmd = [sys.executable, '-m', 'pip', 'install', '--target', os.path.join(temp_extension_dir, 'extension'),
ext_file, '--disable-pip-version-check', '--no-cache-dir']
print_status('Executing "{}"'.format(' '.join(pip_cmd)))
check_call(pip_cmd)
sphinx_cmd = ['sphinx-build', '-b', 'xml', os.path.dirname(os.path.realpath(__file__)), output_dir]
env = copy.copy(os.environ)
env[ENV_KEY_AZURE_EXTENSION_DIR] = temp_extension_dir
print_status('Executing "{}" with {} set to {}'.format(' '.join(sphinx_cmd),
ENV_KEY_AZURE_EXTENSION_DIR,
env['AZURE_EXTENSION_DIR']))
check_call(sphinx_cmd, env=env)
finally:
shutil.rmtree(temp_extension_dir)
print_status('Cleaned up temp directory {}'.format(temp_extension_dir))
print_status('Ref doc output available at {}'.format(output_dir))
print_status('Done.')
def _type_ext_file(val):
ext_file = os.path.realpath(os.path.expanduser(val))
if os.path.isdir(ext_file):
raise argparse.ArgumentTypeError('{} is a directory not an extension file.'.format(ext_file))
if not os.path.isfile(ext_file):
raise argparse.ArgumentTypeError('{} does not exist.'.format(ext_file))
if os.path.splitext(ext_file)[1] != '.whl':
raise argparse.ArgumentTypeError('{} Extension files should end with .whl'.format(ext_file))
return ext_file
def _type_path(val):
out_path = os.path.realpath(os.path.expanduser(val))
if not os.path.isdir(out_path):
raise argparse.ArgumentTypeError('{} is not a directory. Create it or specify different directory.'.format(out_path))
if os.listdir(out_path):
raise argparse.ArgumentTypeError('{} is not empty. Empty output directory required.'.format(out_path))
return out_path
# A small command line interface for the script
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Script to generate reference documentation for a single Azure CLI extension.')
parser.add_argument('-e', '--extension-file', dest='ext_file',
help='Path to the extension .whl file.', required=True, type=_type_ext_file)
parser.add_argument('-o', '--output-dir', dest='output_dir',
help='Path to place the generated documentation. By default, a temporary directory will be created.', required=False, type=_type_path)
args = parser.parse_args()
generate(args.ext_file, args.output_dir)