def _mark_overrides(data): if isinstance(data, list): return [_mark_overrides(elt) for elt in data] elif isinstance(data, dict): marked = {} for key, val in iteritems(data): if isinstance(key, string_types) and key.endswith(':'): key = syaml.syaml_str(key[:-1]) key.override = True marked[key] = _mark_overrides(val) return marked else: return data
def _mark_overrides(data): if isinstance(data, list): return syaml.syaml_list(_mark_overrides(elt) for elt in data) elif isinstance(data, dict): marked = syaml.syaml_dict() for key, val in iteritems(data): if isinstance(key, string_types) and key.endswith(':'): key = syaml.syaml_str(key[:-1]) key.override = True marked[key] = _mark_overrides(val) return marked else: return data
def _mark_overrides(data): if isinstance(data, list): return [_mark_overrides(elt) for elt in data] elif isinstance(data, dict): marked = {} for key, val in data.iteritems(): if isinstance(key, basestring) and key.endswith(':'): key = syaml.syaml_str(key[:-1]) key.override = True marked[key] = _mark_overrides(val) return marked else: return data
def _process_dict_keyname_overrides(data): """Turn a trailing `:' in a key name into an override attribute.""" result = {} for sk, sv in iteritems(data): if sk.endswith(':'): key = syaml.syaml_str(sk[:-1]) key.override = True else: key = sk if isinstance(sv, dict): result[key]\ = InternalConfigScope._process_dict_keyname_overrides(sv) else: result[key] = copy.copy(sv) return result
def process_config_path(path): result = [] if path.startswith(':'): raise syaml.SpackYAMLError("Illegal leading `:' in path `{0}'". format(path), '') seen_override_in_path = False while path: front, sep, path = path.partition(':') if (sep and not path) or path.startswith(':'): if seen_override_in_path: raise syaml.SpackYAMLError("Meaningless second override" " indicator `::' in path `{0}'". format(path), '') path = path.lstrip(':') front = syaml.syaml_str(front) front.override = True seen_override_in_path = True result.append(front) return result
def test_compiler_config_modifications(monkeypatch): s = spack.spec.Spec('cmake') s.concretize() pkg = s.package os.environ['SOME_VAR_STR'] = '' os.environ['SOME_VAR_NUM'] = '0' os.environ['PATH_LIST'] = '/path/third:/path/forth' os.environ['EMPTY_PATH_LIST'] = '' os.environ.pop('NEW_PATH_LIST', None) env_mod = syaml_dict() set_cmd = syaml_dict() env_mod[syaml_str('set')] = set_cmd set_cmd[syaml_str('SOME_VAR_STR')] = syaml_str('SOME_STR') set_cmd[syaml_str('SOME_VAR_NUM')] = 1 monkeypatch.setattr(pkg.compiler, 'environment', env_mod) spack.build_environment.setup_package(pkg, False) assert os.environ['SOME_VAR_STR'] == 'SOME_STR' assert os.environ['SOME_VAR_NUM'] == str(1) env_mod = syaml_dict() unset_cmd = syaml_dict() env_mod[syaml_str('unset')] = unset_cmd unset_cmd[syaml_str('SOME_VAR_STR')] = None monkeypatch.setattr(pkg.compiler, 'environment', env_mod) assert 'SOME_VAR_STR' in os.environ spack.build_environment.setup_package(pkg, False) assert 'SOME_VAR_STR' not in os.environ env_mod = syaml_dict() set_cmd = syaml_dict() env_mod[syaml_str('set')] = set_cmd append_cmd = syaml_dict() env_mod[syaml_str('append-path')] = append_cmd unset_cmd = syaml_dict() env_mod[syaml_str('unset')] = unset_cmd prepend_cmd = syaml_dict() env_mod[syaml_str('prepend-path')] = prepend_cmd set_cmd[syaml_str('EMPTY_PATH_LIST')] = syaml_str('/path/middle') append_cmd[syaml_str('PATH_LIST')] = syaml_str('/path/last') append_cmd[syaml_str('EMPTY_PATH_LIST')] = syaml_str('/path/last') append_cmd[syaml_str('NEW_PATH_LIST')] = syaml_str('/path/last') unset_cmd[syaml_str('SOME_VAR_NUM')] = None prepend_cmd[syaml_str('PATH_LIST')] = syaml_str('/path/first:/path/second') prepend_cmd[syaml_str('EMPTY_PATH_LIST')] = syaml_str('/path/first') prepend_cmd[syaml_str('NEW_PATH_LIST')] = syaml_str('/path/first') prepend_cmd[syaml_str('SOME_VAR_NUM')] = syaml_str('/8') assert 'SOME_VAR_NUM' in os.environ monkeypatch.setattr(pkg.compiler, 'environment', env_mod) spack.build_environment.setup_package(pkg, False) # Check that the order of modifications is respected and the # variable was unset before it was prepended. assert os.environ['SOME_VAR_NUM'] == '/8' expected = '/path/first:/path/second:/path/third:/path/forth:/path/last' assert os.environ['PATH_LIST'] == expected expected = '/path/first:/path/middle:/path/last' assert os.environ['EMPTY_PATH_LIST'] == expected expected = '/path/first:/path/last' assert os.environ['NEW_PATH_LIST'] == expected os.environ.pop('SOME_VAR_STR', None) os.environ.pop('SOME_VAR_NUM', None) os.environ.pop('PATH_LIST', None) os.environ.pop('EMPTY_PATH_LIST', None) os.environ.pop('NEW_PATH_LIST', None)