scripts/ci/index_ref_doc.py (56 lines of code) (raw):
#!/usr/bin/env python
# --------------------------------------------------------------------------------------------
# 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 tempfile
import traceback
import unittest
import shutil
from subprocess import check_call, CalledProcessError
from pkg_resources import parse_version, get_distribution
from six import with_metaclass
from util import get_index_data, get_whl_from_url, get_repo_root
REF_GEN_SCRIPT = os.path.join(get_repo_root(), 'scripts', 'refdoc', 'generate.py')
REF_DOC_OUT_DIR = os.environ.get('AZ_EXT_REF_DOC_OUT_DIR', tempfile.mkdtemp())
if not os.path.isdir(REF_DOC_OUT_DIR):
print('{} is not a directory'.format(REF_DOC_OUT_DIR))
sys.exit(1)
ALL_TESTS = []
CLI_VERSION = get_distribution('azure-cli').version
for extension_name, exts in get_index_data()['extensions'].items():
parsed_cli_version = parse_version(CLI_VERSION)
filtered_exts = []
for ext in exts:
if parsed_cli_version <= parse_version(ext['metadata'].get('azext.maxCliCoreVersion', CLI_VERSION)):
filtered_exts.append(ext)
if not filtered_exts:
continue
candidates_sorted = sorted(filtered_exts, key=lambda c: parse_version(c['metadata']['version']), reverse=True)
chosen = candidates_sorted[0]
ALL_TESTS.append((extension_name, chosen['downloadUrl'], chosen['filename']))
class TestIndexRefDocsMeta(type):
def __new__(mcs, name, bases, _dict):
def gen_test(ext_name, ext_url, filename):
def test(self):
ext_file = get_whl_from_url(ext_url, filename, self.whl_dir)
ref_doc_out_dir = os.path.join(REF_DOC_OUT_DIR, ext_name)
if not os.path.isdir(ref_doc_out_dir):
os.mkdir(ref_doc_out_dir)
script_args = [sys.executable, REF_GEN_SCRIPT, '--extension-file', ext_file, '--output-dir',
ref_doc_out_dir]
try:
check_call(script_args)
except CalledProcessError as e:
traceback.print_exc()
raise e
return test
for ext_name, ext_url, filename in ALL_TESTS:
test_name = "test_ref_doc_%s" % ext_name
_dict[test_name] = gen_test(ext_name, ext_url, filename)
return type.__new__(mcs, name, bases, _dict)
class IndexRefDocs(with_metaclass(TestIndexRefDocsMeta, unittest.TestCase)):
def setUp(self):
self.whl_dir = tempfile.mkdtemp()
def tearDown(self):
shutil.rmtree(self.whl_dir)
if __name__ == '__main__':
unittest.main()