tools/automation/utilities/path.py (108 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.
# --------------------------------------------------------------------------------------------
import os
import glob
from automation.utilities.const import COMMAND_MODULE_PREFIX, EXTENSIONS_MOD_PREFIX
def get_repo_root():
"""Returns the path to the source code root directory"""
current_dir = os.path.dirname(os.path.abspath(__file__))
while not os.path.exists(os.path.join(current_dir, 'CONTRIBUTING.rst')):
current_dir = os.path.dirname(current_dir)
return current_dir
def get_all_module_paths():
"""List all core and command modules"""
return list(get_core_modules_paths()) + list(get_command_modules_paths(include_prefix=True))
def get_config_dir():
""" Returns the users Azure directory. """
return os.getenv('AZURE_CONFIG_DIR', None) or os.path.expanduser(os.path.join('~', '.azure'))
def get_extension_dir():
""" Returns the extensions directory. """
custom_dir = os.environ.get('AZURE_EXTENSION_DIR')
return os.path.expanduser(custom_dir) if custom_dir else os.path.join(get_config_dir(), 'cliextensions')
def get_extensions_paths(include_prefix=False):
glob_pattern = os.path.normcase('/*/{}*'.format(EXTENSIONS_MOD_PREFIX))
for path in glob.glob(get_extension_dir() + glob_pattern):
name = os.path.basename(path)
if not include_prefix:
name = name[len(EXTENSIONS_MOD_PREFIX):]
yield name, path
def get_command_modules_paths(include_prefix=False):
glob_pattern = os.path.normcase('/src/command_modules/{}*/setup.py'.format(COMMAND_MODULE_PREFIX))
for path in glob.glob(get_repo_root() + glob_pattern):
folder = os.path.dirname(path)
name = os.path.basename(folder)
if not include_prefix:
name = name[len(COMMAND_MODULE_PREFIX):]
yield name, folder
def get_command_modules_paths_with_tests(profile):
return get_module_paths_with_tests(get_command_modules_paths(), profile)
def get_core_modules_paths_with_tests(profile):
if profile == 'latest':
for name, path in get_core_modules_paths():
for root, dirs, files in os.walk(path):
if os.path.basename(root) == 'tests':
if name == 'azure-cli-core':
name = 'core'
yield name, path, root
def get_core_modules_paths():
for path in glob.glob(get_repo_root() + os.path.normcase('/src/*/setup.py')):
yield os.path.basename(os.path.dirname(path)), os.path.dirname(path)
def get_module_paths_with_tests(modules, profile):
for name, path in modules:
name = name.replace(COMMAND_MODULE_PREFIX, '')
test_folder = os.path.join(path, 'azure', 'cli', 'command_modules', name, 'tests', profile)
if os.path.exists(test_folder):
yield name, path, test_folder
def make_dirs(path):
"""Create a directories recursively"""
import errno
try:
os.makedirs(path)
except OSError as exc: # Python <= 2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else:
raise
def get_test_results_dir(with_timestamp=None, prefix=None):
"""Returns the folder where test results should be saved to. If the folder doesn't exist,
it will be created."""
result = os.path.join(get_repo_root(), 'test_results')
if isinstance(with_timestamp, bool):
from datetime import datetime
with_timestamp = datetime.now()
if with_timestamp:
if prefix:
result = os.path.join(result, with_timestamp.strftime(prefix + '_%Y%m%d_%H%M%S'))
else:
result = os.path.join(result, with_timestamp.strftime('%Y%m%d_%H%M%S'))
if not os.path.exists(result):
make_dirs(result)
if not os.path.exists(result) or not os.path.isdir(result):
raise Exception('Failed to create test result dir {}'.format(result))
return result
def filter_blacklisted_modules(*black_list_modules):
"""Returns the paths to the modules except those in the black list."""
import itertools
existing_modules = list(itertools.chain(get_core_modules_paths(),
get_command_modules_paths()))
black_list_modules = set(black_list_modules)
return list((name, path) for name, path in existing_modules if name not in black_list_modules)
def filter_user_selected_modules(user_input_modules):
import itertools
existing_modules = list(itertools.chain(get_core_modules_paths(),
get_command_modules_paths()))
if user_input_modules:
selected_modules = set(user_input_modules)
extra = selected_modules - set([name for name, _ in existing_modules])
if any(extra):
print('ERROR: These modules do not exist: {}.'.format(', '.join(extra)))
return None
return list((name, module) for name, module in existing_modules
if name in selected_modules)
else:
return list((name, module) for name, module in existing_modules)
def filter_user_selected_modules_with_tests(user_input_modules=None, profile=None):
import itertools
existing_modules = list(itertools.chain(get_core_modules_paths_with_tests(profile),
get_command_modules_paths_with_tests(profile)))
if user_input_modules is not None:
selected_modules = set(user_input_modules)
extra = selected_modules - set([name for name, _, _ in existing_modules])
# don't count extensions as extras
extra = [x for x in extra if not x.startswith('azext_')]
if any(extra):
print('ERROR: These modules do not exist: {}.'.format(', '.join(extra)))
return None
return list((name, module, test) for name, module, test in existing_modules
if name in selected_modules)
else:
return list((name, module, test) for name, module, test in existing_modules)