def test_find_matching_easyconfigs(self): """Test find_matching_easyconfigs function.""" test_easyconfigs_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'easyconfigs', 'test_ecs') for (name, installver) in [('GCC', '4.8.2'), ('gzip', '1.5-foss-2018a')]: ecs = find_matching_easyconfigs(name, installver, [test_easyconfigs_path]) self.assertTrue(len(ecs) == 1 and ecs[0].endswith('/%s-%s.eb' % (name, installver))) ecs = find_matching_easyconfigs('GCC', '*', [test_easyconfigs_path]) gccvers = ['4.6.3', '4.6.4', '4.8.2', '4.8.3', '4.9.2', '4.9.3-2.25', '4.9.3-2.26', '6.4.0-2.28', '7.3.0-2.30'] self.assertEqual(len(ecs), len(gccvers)) ecs_basename = [os.path.basename(ec) for ec in ecs] for gccver in gccvers: gcc_ec = 'GCC-%s.eb' % gccver self.assertTrue(gcc_ec in ecs_basename, "%s is included in %s" % (gcc_ec, ecs_basename))
def list_software(output_format=FORMAT_TXT, detailed=False, only_installed=False): """ Show list of supported software :param output_format: output format to use :param detailed: whether or not to return detailed information (incl. version, versionsuffix, toolchain info) :param only_installed: only retain software for which a corresponding module is available :return: multi-line string presenting requested info """ silent = build_option('silent') ec_paths = find_matching_easyconfigs('*', '*', build_option('robot_path') or []) ecs = [] cnt = len(ec_paths) for idx, ec_path in enumerate(ec_paths): # full EasyConfig instance is only required when module name is needed # this is significantly slower (5-10x) than a 'shallow' parse via EasyConfigParser if only_installed: ec = process_easyconfig(ec_path, validate=False, parse_only=True)[0]['ec'] else: ec = EasyConfigParser(filename=ec_path).get_config_dict() ecs.append(ec) print_msg('\r', prefix=False, newline=False, silent=silent) print_msg("Processed %d/%d easyconfigs..." % (idx + 1, cnt), newline=False, silent=silent) print_msg('', prefix=False, silent=silent) software = {} for ec in ecs: software.setdefault(ec['name'], []) if is_system_toolchain(ec['toolchain']['name']): toolchain = SYSTEM_TOOLCHAIN_NAME else: toolchain = '%s/%s' % (ec['toolchain']['name'], ec['toolchain']['version']) keys = ['description', 'homepage', 'version', 'versionsuffix'] info = {'toolchain': toolchain} for key in keys: info[key] = ec.get(key, '') # make sure values like homepage & versionsuffix get properly templated if isinstance(ec, dict): template_values = template_constant_dict(ec) for key in keys: if '%(' in info[key]: try: info[key] = info[key] % template_values except (KeyError, TypeError, ValueError) as err: _log.debug("Ignoring failure to resolve templates: %s", err) software[ec['name']].append(info) if only_installed: software[ec['name']][-1].update({'mod_name': ec.full_mod_name}) print_msg("Found %d different software packages" % len(software), silent=silent) if only_installed: avail_mod_names = modules_tool().available() # rebuild software, only retain entries with a corresponding available module software, all_software = {}, software for key in all_software: for entry in all_software[key]: if entry['mod_name'] in avail_mod_names: software.setdefault(key, []).append(entry) print_msg("Retained %d installed software packages" % len(software), silent=silent) return generate_doc('list_software_%s' % output_format, [software, detailed])
def list_software(output_format=FORMAT_TXT, detailed=False, only_installed=False): """ Show list of supported software :param output_format: output format to use :param detailed: whether or not to return detailed information (incl. version, versionsuffix, toolchain info) :param only_installed: only retain software for which a corresponding module is available :return: multi-line string presenting requested info """ silent = build_option('silent') ec_paths = find_matching_easyconfigs('*', '*', build_option('robot_path') or []) ecs = [] cnt = len(ec_paths) for idx, ec_path in enumerate(ec_paths): # full EasyConfig instance is only required when module name is needed # this is significantly slower (5-10x) than a 'shallow' parse via EasyConfigParser if only_installed: ec = process_easyconfig(ec_path, validate=False, parse_only=True)[0]['ec'] else: ec = EasyConfigParser(filename=ec_path).get_config_dict() ecs.append(ec) print_msg('\r', prefix=False, newline=False, silent=silent) print_msg("Processed %d/%d easyconfigs..." % (idx+1, cnt), newline=False, silent=silent) print_msg('', prefix=False, silent=silent) software = {} for ec in ecs: software.setdefault(ec['name'], []) if ec['toolchain']['name'] == DUMMY_TOOLCHAIN_NAME: toolchain = DUMMY_TOOLCHAIN_NAME else: toolchain = '%s/%s' % (ec['toolchain']['name'], ec['toolchain']['version']) keys = ['description', 'homepage', 'version', 'versionsuffix'] info = {'toolchain': toolchain} for key in keys: info[key] = ec.get(key, '') # make sure values like homepage & versionsuffix get properly templated if isinstance(ec, dict): template_values = template_constant_dict(ec, skip_lower=False) for key in keys: if '%(' in info[key]: try: info[key] = info[key] % template_values except (KeyError, TypeError, ValueError) as err: _log.debug("Ignoring failure to resolve templates: %s", err) software[ec['name']].append(info) if only_installed: software[ec['name']][-1].update({'mod_name': ec.full_mod_name}) print_msg("Found %d different software packages" % len(software), silent=silent) if only_installed: avail_mod_names = modules_tool().available() # rebuild software, only retain entries with a corresponding available module software, all_software = {}, software for key in all_software: for entry in all_software[key]: if entry['mod_name'] in avail_mod_names: software.setdefault(key, []).append(entry) print_msg("Retained %d installed software packages" % len(software), silent=silent) return generate_doc('list_software_%s' % output_format, [software, detailed])
def list_software(output_format=FORMAT_TXT, detailed=False, only_installed=False): """ Show list of supported software :param output_format: output format to use :param detailed: whether or not to return detailed information (incl. version, versionsuffix, toolchain info) :param only_installed: only retain software for which a corresponding module is available :return: multi-line string presenting requested info """ silent = build_option("silent") ec_paths = find_matching_easyconfigs("*", "*", build_option("robot_path") or []) ecs = [] cnt = len(ec_paths) for idx, ec_path in enumerate(ec_paths): # full EasyConfig instance is only required when module name is needed # this is significantly slower (5-10x) than a 'shallow' parse via EasyConfigParser if only_installed: ec = process_easyconfig(ec_path, validate=False, parse_only=True)[0]["ec"] else: ec = EasyConfigParser(filename=ec_path).get_config_dict() ecs.append(ec) print_msg("\r", prefix=False, newline=False, silent=silent) print_msg("Processed %d/%d easyconfigs..." % (idx + 1, cnt), newline=False, silent=silent) print_msg("", prefix=False, silent=silent) software = {} for ec in ecs: software.setdefault(ec["name"], []) if ec["toolchain"]["name"] == DUMMY_TOOLCHAIN_NAME: toolchain = DUMMY_TOOLCHAIN_NAME else: toolchain = "%s/%s" % (ec["toolchain"]["name"], ec["toolchain"]["version"]) versionsuffix = ec.get("versionsuffix", "") # make sure versionsuffix gets properly templated if versionsuffix and isinstance(ec, dict): template_values = template_constant_dict(ec) versionsuffix = versionsuffix % template_values software[ec["name"]].append( { "description": ec["description"], "homepage": ec["homepage"], "toolchain": toolchain, "version": ec["version"], "versionsuffix": versionsuffix, } ) if only_installed: software[ec["name"]][-1].update({"mod_name": ec.full_mod_name}) print_msg("Found %d different software packages" % len(software), silent=silent) if only_installed: avail_mod_names = modules_tool().available() # rebuild software, only retain entries with a corresponding available module software, all_software = {}, software for key in all_software: for entry in all_software[key]: if entry["mod_name"] in avail_mod_names: software.setdefault(key, []).append(entry) print_msg("Retained %d installed software packages" % len(software), silent=silent) return generate_doc("list_software_%s" % output_format, [software, detailed])