diff --git a/lib/spack/spack/bootstrap/config.py b/lib/spack/spack/bootstrap/config.py index 73e985f5a4..e38c5669d9 100644 --- a/lib/spack/spack/bootstrap/config.py +++ b/lib/spack/spack/bootstrap/config.py @@ -124,9 +124,9 @@ def _read_and_sanitize_configuration() -> Dict[str, Any]: def _bootstrap_config_scopes() -> Sequence["spack.config.ConfigScope"]: tty.debug("[BOOTSTRAP CONFIG SCOPE] name=_builtin") config_scopes: MutableSequence["spack.config.ConfigScope"] = [ - spack.config.InternalConfigScope("_builtin", spack.config.config_defaults) + spack.config.InternalConfigScope("_builtin", spack.config.CONFIG_DEFAULTS) ] - configuration_paths = (spack.config.configuration_defaults_path, ("bootstrap", _config_path())) + configuration_paths = (spack.config.CONFIGURATION_DEFAULTS_PATH, ("bootstrap", _config_path())) for name, path in configuration_paths: platform = spack.platforms.host().name platform_scope = spack.config.ConfigScope( diff --git a/lib/spack/spack/cmd/bootstrap.py b/lib/spack/spack/cmd/bootstrap.py index 672d152565..71c3d3a045 100644 --- a/lib/spack/spack/cmd/bootstrap.py +++ b/lib/spack/spack/cmd/bootstrap.py @@ -69,11 +69,10 @@ def _add_scope_option(parser): scopes = spack.config.scopes() - scopes_metavar = spack.config.scopes_metavar parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, help="configuration scope to read/modify", ) @@ -170,7 +169,7 @@ def _reset(args): if not ok_to_continue: raise RuntimeError("Aborting") - for scope in spack.config.config.file_scopes: + for scope in spack.config.CONFIG.file_scopes: # The default scope should stay untouched if scope.name == "defaults": continue @@ -187,7 +186,7 @@ def _reset(args): if os.path.exists(bootstrap_yaml): shutil.move(bootstrap_yaml, backup_file) - spack.config.config.clear_caches() + spack.config.CONFIG.clear_caches() def _root(args): diff --git a/lib/spack/spack/cmd/buildcache.py b/lib/spack/spack/cmd/buildcache.py index 74594ac3f1..cd89201f52 100644 --- a/lib/spack/spack/cmd/buildcache.py +++ b/lib/spack/spack/cmd/buildcache.py @@ -149,12 +149,11 @@ def setup_parser(subparser: argparse.ArgumentParser): # used to construct scope arguments below scopes = spack.config.scopes() - scopes_metavar = spack.config.scopes_metavar check.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_modify_scope(), help="configuration scope containing mirrors to check", ) diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index e16ab4d7f4..38695e239a 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -24,7 +24,6 @@ def setup_parser(subparser): sp = subparser.add_subparsers(metavar="SUBCOMMAND", dest="compiler_command") scopes = spack.config.scopes() - scopes_metavar = spack.config.scopes_metavar # Find find_parser = sp.add_parser( @@ -36,7 +35,7 @@ def setup_parser(subparser): find_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_modify_scope("compilers"), help="configuration scope to modify", ) @@ -50,7 +49,7 @@ def setup_parser(subparser): remove_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=None, help="configuration scope to modify", ) @@ -60,7 +59,7 @@ def setup_parser(subparser): list_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_list_scope(), help="configuration scope to read from", ) @@ -71,7 +70,7 @@ def setup_parser(subparser): info_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_list_scope(), help="configuration scope to read from", ) @@ -93,7 +92,7 @@ def compiler_find(args): n = len(new_compilers) s = "s" if n > 1 else "" - config = spack.config.config + config = spack.config.CONFIG filename = config.get_config_filename(args.scope, "compilers") tty.msg("Added %d new compiler%s to %s" % (n, s, filename)) colify(reversed(sorted(c.spec.display_str for c in new_compilers)), indent=4) diff --git a/lib/spack/spack/cmd/compilers.py b/lib/spack/spack/cmd/compilers.py index 81f222aff1..6d0ff43ea2 100644 --- a/lib/spack/spack/cmd/compilers.py +++ b/lib/spack/spack/cmd/compilers.py @@ -13,12 +13,11 @@ def setup_parser(subparser): scopes = spack.config.scopes() - scopes_metavar = spack.config.scopes_metavar subparser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, help="configuration scope to read/modify", ) diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py index 1d85876af7..c4446b475a 100644 --- a/lib/spack/spack/cmd/config.py +++ b/lib/spack/spack/cmd/config.py @@ -27,13 +27,12 @@ def setup_parser(subparser): scopes = spack.config.scopes() - scopes_metavar = spack.config.scopes_metavar # User can only choose one subparser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, help="configuration scope to read/modify", ) @@ -45,7 +44,7 @@ def setup_parser(subparser): help="configuration section to print\n\noptions: %(choices)s", nargs="?", metavar="section", - choices=spack.config.section_schemas, + choices=spack.config.SECTION_SCHEMAS, ) blame_parser = sp.add_parser( @@ -55,7 +54,7 @@ def setup_parser(subparser): "section", help="configuration section to print\n\noptions: %(choices)s", metavar="section", - choices=spack.config.section_schemas, + choices=spack.config.SECTION_SCHEMAS, ) edit_parser = sp.add_parser("edit", help="edit configuration file") @@ -64,7 +63,7 @@ def setup_parser(subparser): help="configuration section to edit\n\noptions: %(choices)s", metavar="section", nargs="?", - choices=spack.config.section_schemas, + choices=spack.config.SECTION_SCHEMAS, ) edit_parser.add_argument( "--print-file", action="store_true", help="print the file name that would be edited" @@ -146,10 +145,10 @@ def config_get(args): scope, section = _get_scope_and_section(args) if section is not None: - spack.config.config.print_section(section) + spack.config.CONFIG.print_section(section) elif scope and scope.startswith("env:"): - config_file = spack.config.config.get_config_filename(scope, section) + config_file = spack.config.CONFIG.get_config_filename(scope, section) if os.path.exists(config_file): with open(config_file) as f: print(f.read()) @@ -162,7 +161,7 @@ def config_get(args): def config_blame(args): """Print out line-by-line blame of merged YAML.""" - spack.config.config.print_section(args.section, blame=True) + spack.config.CONFIG.print_section(args.section, blame=True) def config_edit(args): @@ -181,7 +180,7 @@ def config_edit(args): scope, section = _get_scope_and_section(args) if not scope and not section: tty.die("`spack config edit` requires a section argument or an active environment.") - config_file = spack.config.config.get_config_filename(scope, section) + config_file = spack.config.CONFIG.get_config_filename(scope, section) if args.print_file: print(config_file) @@ -194,7 +193,7 @@ def config_list(args): Used primarily for shell tab completion scripts. """ - print(" ".join(list(spack.config.section_schemas))) + print(" ".join(list(spack.config.SECTION_SCHEMAS))) def config_add(args): @@ -251,19 +250,19 @@ def _can_update_config_file(scope: spack.config.ConfigScope, cfg_file): def config_update(args): # Read the configuration files - spack.config.config.get_config(args.section, scope=args.scope) + spack.config.CONFIG.get_config(args.section, scope=args.scope) updates: List[spack.config.ConfigScope] = list( filter( lambda s: not isinstance( s, (spack.config.InternalConfigScope, spack.config.ImmutableConfigScope) ), - spack.config.config.format_updates[args.section], + spack.config.CONFIG.format_updates[args.section], ) ) cannot_overwrite, skip_system_scope = [], False for scope in updates: - cfg_file = spack.config.config.get_config_filename(scope.name, args.section) + cfg_file = spack.config.CONFIG.get_config_filename(scope.name, args.section) can_be_updated = _can_update_config_file(scope, cfg_file) if not can_be_updated: if scope.name == "system": @@ -302,7 +301,7 @@ def config_update(args): " the latest schema format:\n\n" ) for scope in updates: - cfg_file = spack.config.config.get_config_filename(scope.name, args.section) + cfg_file = spack.config.CONFIG.get_config_filename(scope.name, args.section) msg += "\t[scope={0}, file={1}]\n".format(scope.name, cfg_file) msg += ( "\nIf the configuration files are updated, versions of Spack " @@ -325,7 +324,7 @@ def config_update(args): # Make a backup copy and rewrite the file bkp_file = cfg_file + ".bkp" shutil.copy(cfg_file, bkp_file) - spack.config.config.update_config(args.section, data, scope=scope.name, force=True) + spack.config.CONFIG.update_config(args.section, data, scope=scope.name, force=True) tty.msg(f'File "{cfg_file}" update [backup={bkp_file}]') @@ -337,13 +336,13 @@ def _can_revert_update(scope_dir, cfg_file, bkp_file): def config_revert(args): - scopes = [args.scope] if args.scope else [x.name for x in spack.config.config.file_scopes] + scopes = [args.scope] if args.scope else [x.name for x in spack.config.CONFIG.file_scopes] # Search for backup files in the configuration scopes Entry = collections.namedtuple("Entry", ["scope", "cfg", "bkp"]) to_be_restored, cannot_overwrite = [], [] for scope in scopes: - cfg_file = spack.config.config.get_config_filename(scope, args.section) + cfg_file = spack.config.CONFIG.get_config_filename(scope, args.section) bkp_file = cfg_file + ".bkp" # If the backup files doesn't exist move to the next scope @@ -457,7 +456,7 @@ def config_prefer_upstream(args): existing = spack.config.get("packages", scope=scope) new = spack.config.merge_yaml(existing, pkgs) spack.config.set("packages", new, scope) - config_file = spack.config.config.get_config_filename(scope, section) + config_file = spack.config.CONFIG.get_config_filename(scope, section) tty.msg("Updated config at {0}".format(config_file)) diff --git a/lib/spack/spack/cmd/external.py b/lib/spack/spack/cmd/external.py index d27b5df327..895aae0c44 100644 --- a/lib/spack/spack/cmd/external.py +++ b/lib/spack/spack/cmd/external.py @@ -13,6 +13,7 @@ import spack import spack.cmd import spack.cmd.common.arguments +import spack.config import spack.cray_manifest as cray_manifest import spack.detection import spack.error @@ -27,7 +28,6 @@ def setup_parser(subparser): sp = subparser.add_subparsers(metavar="SUBCOMMAND", dest="external_command") scopes = spack.config.scopes() - scopes_metavar = spack.config.scopes_metavar find_parser = sp.add_parser("find", help="add external packages to packages.yaml") find_parser.add_argument( @@ -47,7 +47,7 @@ def setup_parser(subparser): find_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_modify_scope("packages"), help="configuration scope to modify", ) @@ -165,7 +165,7 @@ def external_find(args): detected_packages, scope=args.scope, buildable=not args.not_buildable ) if new_entries: - path = spack.config.config.get_config_filename(args.scope, "packages") + path = spack.config.CONFIG.get_config_filename(args.scope, "packages") msg = "The following specs have been detected on this system and added to {0}" tty.msg(msg.format(path)) spack.cmd.display_specs(new_entries) diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index e8d631f10a..6edae785a0 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -90,7 +90,6 @@ def setup_parser(subparser): # used to construct scope arguments below scopes = spack.config.scopes() - scopes_metavar = spack.config.scopes_metavar # Add add_parser = sp.add_parser("add", help=mirror_add.__doc__) @@ -99,7 +98,7 @@ def setup_parser(subparser): add_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_modify_scope(), help="configuration scope to modify", ) @@ -119,7 +118,7 @@ def setup_parser(subparser): remove_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_modify_scope(), help="configuration scope to modify", ) @@ -138,7 +137,7 @@ def setup_parser(subparser): set_url_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_modify_scope(), help="configuration scope to modify", ) @@ -167,7 +166,7 @@ def setup_parser(subparser): set_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_modify_scope(), help="configuration scope to modify", ) @@ -178,7 +177,7 @@ def setup_parser(subparser): list_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_list_scope(), help="configuration scope to read from", ) diff --git a/lib/spack/spack/cmd/repo.py b/lib/spack/spack/cmd/repo.py index 5d81b6009d..7953f227e5 100644 --- a/lib/spack/spack/cmd/repo.py +++ b/lib/spack/spack/cmd/repo.py @@ -20,7 +20,6 @@ def setup_parser(subparser): sp = subparser.add_subparsers(metavar="SUBCOMMAND", dest="repo_command") scopes = spack.config.scopes() - scopes_metavar = spack.config.scopes_metavar # Create create_parser = sp.add_parser("create", help=repo_create.__doc__) @@ -45,7 +44,7 @@ def setup_parser(subparser): list_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_list_scope(), help="configuration scope to read from", ) @@ -56,7 +55,7 @@ def setup_parser(subparser): add_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_modify_scope(), help="configuration scope to modify", ) @@ -69,7 +68,7 @@ def setup_parser(subparser): remove_parser.add_argument( "--scope", choices=scopes, - metavar=scopes_metavar, + metavar=spack.config.SCOPES_METAVAR, default=spack.config.default_modify_scope(), help="configuration scope to modify", ) diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index ce84a56a43..082577ac6c 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -135,7 +135,7 @@ def _init_compiler_config(*, scope): def compiler_config_files(): config_files = list() - config = spack.config.config + config = spack.config.CONFIG for scope in config.file_scopes: name = scope.name compiler_config = config.get("compilers", scope=name) @@ -169,7 +169,7 @@ def remove_compiler_from_config(compiler_spec, scope=None): """ candidate_scopes = [scope] if scope is None: - candidate_scopes = spack.config.config.scopes.keys() + candidate_scopes = spack.config.CONFIG.scopes.keys() removal_happened = False for current_scope in candidate_scopes: @@ -523,7 +523,7 @@ def compiler_for_spec(compiler_spec, arch_spec): @_auto_compiler_spec def get_compiler_duplicates(compiler_spec, arch_spec): - config = spack.config.config + config = spack.config.CONFIG scope_to_compilers = {} for scope in config.scopes: diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index a5481f74b4..5a46d1f999 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -28,6 +28,7 @@ import spack.abi import spack.compilers +import spack.config import spack.environment import spack.error import spack.platforms @@ -37,7 +38,6 @@ import spack.tengine import spack.util.path import spack.variant as vt -from spack.config import config from spack.package_prefs import PackagePrefs, is_spec_buildable, spec_externals from spack.version import ClosedOpenRange, VersionList, ver @@ -76,7 +76,7 @@ class Concretizer: def __init__(self, abstract_spec=None): if Concretizer.check_for_compiler_existence is None: - Concretizer.check_for_compiler_existence = not config.get( + Concretizer.check_for_compiler_existence = not spack.config.get( "config:install_missing_compilers", False ) self.abstract_spec = abstract_spec diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py index 5035e2c0ed..b3fb5648ac 100644 --- a/lib/spack/spack/config.py +++ b/lib/spack/spack/config.py @@ -47,6 +47,8 @@ import spack.platforms import spack.schema import spack.schema.bootstrap +import spack.schema.cdash +import spack.schema.ci import spack.schema.compilers import spack.schema.concretizer import spack.schema.config @@ -64,7 +66,7 @@ from spack.util.cpus import cpus_available #: Dict from section names -> schema for that section -section_schemas = { +SECTION_SCHEMAS = { "compilers": spack.schema.compilers.schema, "concretizer": spack.schema.concretizer.schema, "mirrors": spack.schema.mirrors.schema, @@ -80,16 +82,16 @@ # Same as above, but including keys for environments # this allows us to unify config reading between configs and environments -all_schemas = copy.deepcopy(section_schemas) -all_schemas.update({spack.schema.env.TOP_LEVEL_KEY: spack.schema.env.schema}) +_ALL_SCHEMAS = copy.deepcopy(SECTION_SCHEMAS) +_ALL_SCHEMAS.update({spack.schema.env.TOP_LEVEL_KEY: spack.schema.env.schema}) #: Path to the default configuration -configuration_defaults_path = ("defaults", os.path.join(spack.paths.etc_path, "defaults")) +CONFIGURATION_DEFAULTS_PATH = ("defaults", os.path.join(spack.paths.etc_path, "defaults")) #: Hard-coded default values for some key configuration options. #: This ensures that Spack will still work even if config.yaml in #: the defaults scope is removed. -config_defaults = { +CONFIG_DEFAULTS = { "config": { "debug": False, "connect_timeout": 10, @@ -105,10 +107,10 @@ #: metavar to use for commands that accept scopes #: this is shorter and more readable than listing all choices -scopes_metavar = "{defaults,system,site,user}[/PLATFORM] or env:ENVIRONMENT" +SCOPES_METAVAR = "{defaults,system,site,user}[/PLATFORM] or env:ENVIRONMENT" #: Base name for the (internal) overrides scope. -overrides_base_name = "overrides-" +_OVERRIDES_BASE_NAME = "overrides-" class ConfigScope: @@ -134,7 +136,7 @@ def get_section_filename(self, section): def get_section(self, section): if section not in self.sections: path = self.get_section_filename(section) - schema = section_schemas[section] + schema = SECTION_SCHEMAS[section] data = read_config_file(path, schema) self.sections[section] = data return self.sections[section] @@ -145,7 +147,7 @@ def _write_section(self, section): # We copy data here to avoid adding defaults at write time validate_data = copy.deepcopy(data) - validate(validate_data, section_schemas[section]) + validate(validate_data, SECTION_SCHEMAS[section]) try: mkdirp(self.path) @@ -317,7 +319,7 @@ def __init__(self, name, data=None): data = InternalConfigScope._process_dict_keyname_overrides(data) for section in data: dsec = data[section] - validate({section: dsec}, section_schemas[section]) + validate({section: dsec}, SECTION_SCHEMAS[section]) self.sections[section] = _mark_internal(syaml.syaml_dict({section: dsec}), name) def get_section_filename(self, section): @@ -333,7 +335,7 @@ def _write_section(self, section): """This only validates, as the data is already in memory.""" data = self.get_section(section) if data is not None: - validate(data, section_schemas[section]) + validate(data, SECTION_SCHEMAS[section]) self.sections[section] = _mark_internal(data, self.name) def __repr__(self): @@ -711,11 +713,11 @@ def override(path_or_scope, value=None): """ if isinstance(path_or_scope, ConfigScope): overrides = path_or_scope - config.push_scope(path_or_scope) + CONFIG.push_scope(path_or_scope) else: - base_name = overrides_base_name + base_name = _OVERRIDES_BASE_NAME # Ensure the new override gets a unique scope name - current_overrides = [s.name for s in config.matching_scopes(r"^{0}".format(base_name))] + current_overrides = [s.name for s in CONFIG.matching_scopes(r"^{0}".format(base_name))] num_overrides = len(current_overrides) while True: scope_name = "{0}{1}".format(base_name, num_overrides) @@ -725,19 +727,19 @@ def override(path_or_scope, value=None): break overrides = InternalConfigScope(scope_name) - config.push_scope(overrides) - config.set(path_or_scope, value, scope=scope_name) + CONFIG.push_scope(overrides) + CONFIG.set(path_or_scope, value, scope=scope_name) try: - yield config + yield CONFIG finally: - scope = config.remove_scope(overrides.name) + scope = CONFIG.remove_scope(overrides.name) assert scope is overrides #: configuration scopes added on the command line #: set by ``spack.main.main()``. -command_line_scopes: List[str] = [] +COMMAND_LINE_SCOPES: List[str] = [] def _add_platform_scope(cfg, scope_type, name, path): @@ -781,14 +783,14 @@ def create(): cfg = Configuration() # first do the builtin, hardcoded defaults - builtin = InternalConfigScope("_builtin", config_defaults) + builtin = InternalConfigScope("_builtin", CONFIG_DEFAULTS) cfg.push_scope(builtin) # Builtin paths to configuration files in Spack configuration_paths = [ # Default configuration scope is the lowest-level scope. These are # versioned with Spack and can be overridden by systems, sites or users - configuration_defaults_path + CONFIGURATION_DEFAULTS_PATH ] disable_local_config = "SPACK_DISABLE_LOCAL_CONFIG" in os.environ @@ -815,7 +817,7 @@ def create(): _add_platform_scope(cfg, ConfigScope, name, path) # add command-line scopes - _add_command_line_scopes(cfg, command_line_scopes) + _add_command_line_scopes(cfg, COMMAND_LINE_SCOPES) # we make a special scope for spack commands so that they can # override configuration options. @@ -825,7 +827,7 @@ def create(): #: This is the singleton configuration instance for Spack. -config: Union[Configuration, llnl.util.lang.Singleton] = llnl.util.lang.Singleton(create) +CONFIG: Union[Configuration, llnl.util.lang.Singleton] = llnl.util.lang.Singleton(create) def add_from_file(filename, scope=None): @@ -838,7 +840,7 @@ def add_from_file(filename, scope=None): # update all sections from config dict # We have to iterate on keys to keep overrides from the file for section in data.keys(): - if section in section_schemas.keys(): + if section in SECTION_SCHEMAS.keys(): # Special handling for compiler scope difference # Has to be handled after we choose a section if scope is None: @@ -849,7 +851,7 @@ def add_from_file(filename, scope=None): new = merge_yaml(existing, value) # We cannot call config.set directly (set is a type) - config.set(section, new, scope) + CONFIG.set(section, new, scope) def add(fullpath, scope=None): @@ -897,12 +899,12 @@ def add(fullpath, scope=None): # merge value into existing new = merge_yaml(existing, value) - config.set(path, new, scope) + CONFIG.set(path, new, scope) def get(path, default=None, scope=None): """Module-level wrapper for ``Configuration.get()``.""" - return config.get(path, default, scope) + return CONFIG.get(path, default, scope) def set(path, value, scope=None): @@ -910,26 +912,26 @@ def set(path, value, scope=None): Accepts the path syntax described in ``get()``. """ - return config.set(path, value, scope) + return CONFIG.set(path, value, scope) def add_default_platform_scope(platform): plat_name = os.path.join("defaults", platform) - plat_path = os.path.join(configuration_defaults_path[1], platform) - config.push_scope(ConfigScope(plat_name, plat_path)) + plat_path = os.path.join(CONFIGURATION_DEFAULTS_PATH[1], platform) + CONFIG.push_scope(ConfigScope(plat_name, plat_path)) def scopes(): """Convenience function to get list of configuration scopes.""" - return config.scopes + return CONFIG.scopes def _validate_section_name(section): """Exit if the section is not a valid section.""" - if section not in section_schemas: + if section not in SECTION_SCHEMAS: raise ConfigSectionError( "Invalid config section: '%s'. Options are: %s" - % (section, " ".join(section_schemas.keys())) + % (section, " ".join(SECTION_SCHEMAS.keys())) ) @@ -990,7 +992,7 @@ def read_config_file(filename, schema=None): if data: if not schema: key = next(iter(data)) - schema = all_schemas[key] + schema = _ALL_SCHEMAS[key] validate(data, schema) return data @@ -1089,7 +1091,7 @@ def get_valid_type(path): test_data = {component: test_data} try: - validate(test_data, section_schemas[section]) + validate(test_data, SECTION_SCHEMAS[section]) except (ConfigFormatError, AttributeError) as e: jsonschema_error = e.validation_error if jsonschema_error.validator == "type": @@ -1278,9 +1280,9 @@ def default_modify_scope(section="config"): If this is not 'compilers', a general (non-platform) scope is used. """ if section == "compilers": - return spack.config.config.highest_precedence_scope().name + return CONFIG.highest_precedence_scope().name else: - return spack.config.config.highest_precedence_non_platform_scope().name + return CONFIG.highest_precedence_non_platform_scope().name def default_list_scope(): @@ -1337,18 +1339,18 @@ def use_configuration(*scopes_or_paths): Returns: Configuration object associated with the scopes passed as arguments """ - global config + global CONFIG # Normalize input and construct a Configuration object configuration = _config_from(scopes_or_paths) - config.clear_caches(), configuration.clear_caches() + CONFIG.clear_caches(), configuration.clear_caches() - saved_config, config = config, configuration + saved_config, CONFIG = CONFIG, configuration try: yield configuration finally: - config = saved_config + CONFIG = saved_config @llnl.util.lang.memoized diff --git a/lib/spack/spack/environment/environment.py b/lib/spack/spack/environment/environment.py index 95d00f15a2..176273c2a4 100644 --- a/lib/spack/spack/environment/environment.py +++ b/lib/spack/spack/environment/environment.py @@ -2448,13 +2448,13 @@ def make_repo_path(root): def prepare_config_scope(env): """Add env's scope to the global configuration search path.""" for scope in env.config_scopes(): - spack.config.config.push_scope(scope) + spack.config.CONFIG.push_scope(scope) def deactivate_config_scope(env): """Remove any scopes from env from the global config path.""" for scope in env.config_scopes(): - spack.config.config.remove_scope(scope.name) + spack.config.CONFIG.remove_scope(scope.name) def manifest_file(env_name_or_dir): diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index c4df523798..1d2909b49b 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -602,10 +602,10 @@ def setup_main_options(args): key = syaml.syaml_str("repos") key.override = True - spack.config.config.scopes["command_line"].sections["repos"] = syaml.syaml_dict( + spack.config.CONFIG.scopes["command_line"].sections["repos"] = syaml.syaml_dict( [(key, [spack.paths.mock_packages_path])] ) - spack.repo.PATH = spack.repo.create(spack.config.config) + spack.repo.PATH = spack.repo.create(spack.config.CONFIG) # If the user asked for it, don't check ssl certs. if args.insecure: @@ -930,7 +930,7 @@ def _main(argv=None): # make spack.config aware of any command line configuration scopes if args.config_scopes: - spack.config.command_line_scopes = args.config_scopes + spack.config.COMMAND_LINE_SCOPES = args.config_scopes # ensure options on spack command come before everything setup_main_options(args) diff --git a/lib/spack/spack/modules/common.py b/lib/spack/spack/modules/common.py index d2eedc7230..5667de65b9 100644 --- a/lib/spack/spack/modules/common.py +++ b/lib/spack/spack/modules/common.py @@ -833,7 +833,7 @@ def ensure_modules_are_enabled_or_warn(): return # Check if we have custom TCL module sections - for scope in spack.config.config.file_scopes: + for scope in spack.config.CONFIG.file_scopes: # Skip default configuration if scope.name.startswith("default"): continue diff --git a/lib/spack/spack/platforms/__init__.py b/lib/spack/spack/platforms/__init__.py index f83f5fb98e..1a41d26971 100644 --- a/lib/spack/spack/platforms/__init__.py +++ b/lib/spack/spack/platforms/__init__.py @@ -64,7 +64,7 @@ def use_platform(new_platform): host = _PickleableCallable(new_platform) # Clear configuration and compiler caches - spack.config.config.clear_caches() + spack.config.CONFIG.clear_caches() spack.compilers._cache_config_files = [] yield new_platform @@ -73,5 +73,5 @@ def use_platform(new_platform): host = original_host_fn # Clear configuration and compiler caches - spack.config.config.clear_caches() + spack.config.CONFIG.clear_caches() spack.compilers._cache_config_files = [] diff --git a/lib/spack/spack/repo.py b/lib/spack/spack/repo.py index f57a79aaea..9d49ee4f1d 100644 --- a/lib/spack/spack/repo.py +++ b/lib/spack/spack/repo.py @@ -1357,7 +1357,7 @@ def create_or_construct(path, namespace=None): def _path(configuration=None): """Get the singleton RepoPath instance for Spack.""" - configuration = configuration or spack.config.config + configuration = configuration or spack.config.CONFIG return create(configuration=configuration) @@ -1404,14 +1404,14 @@ def use_repositories(*paths_and_repos, **kwargs): paths = [getattr(x, "root", x) for x in paths_and_repos] scope_name = "use-repo-{}".format(uuid.uuid4()) repos_key = "repos:" if override else "repos" - spack.config.config.push_scope( + spack.config.CONFIG.push_scope( spack.config.InternalConfigScope(name=scope_name, data={repos_key: paths}) ) - PATH, saved = create(configuration=spack.config.config), PATH + PATH, saved = create(configuration=spack.config.CONFIG), PATH try: yield PATH finally: - spack.config.config.remove_scope(scope_name=scope_name) + spack.config.CONFIG.remove_scope(scope_name=scope_name) PATH = saved diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index 880e22d492..e449b944ce 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -1328,7 +1328,7 @@ def provider_requirements(self): "Internal Error: possible_virtuals is not populated. Please report to the spack" " maintainers" ) - packages_yaml = spack.config.config.get("packages") + packages_yaml = spack.config.CONFIG.get("packages") assert self.possible_virtuals is not None, msg for virtual_str in sorted(self.possible_virtuals): requirements = packages_yaml.get(virtual_str, {}).get("require", []) diff --git a/lib/spack/spack/store.py b/lib/spack/spack/store.py index a0ab11c4c1..709074dea3 100644 --- a/lib/spack/spack/store.py +++ b/lib/spack/spack/store.py @@ -212,7 +212,7 @@ def create(configuration: ConfigurationType) -> Store: Args: configuration: configuration to create a store. """ - configuration = configuration or spack.config.config + configuration = configuration or spack.config.CONFIG config_dict = configuration.get("config") root, unpadded_root, projections = parse_install_tree(config_dict) hash_length = configuration.get("config:install_hash_length") @@ -234,7 +234,7 @@ def create(configuration: ConfigurationType) -> Store: def _create_global() -> Store: - result = create(configuration=spack.config.config) + result = create(configuration=spack.config.CONFIG) return result @@ -372,10 +372,10 @@ def use_store( # Swap the store with the one just constructed and return it ensure_singleton_created() - spack.config.config.push_scope( + spack.config.CONFIG.push_scope( spack.config.InternalConfigScope(name=scope_name, data={"config": {"install_tree": data}}) ) - temporary_store = create(configuration=spack.config.config) + temporary_store = create(configuration=spack.config.CONFIG) original_store, STORE = STORE, temporary_store try: @@ -383,7 +383,7 @@ def use_store( finally: # Restore the original store STORE = original_store - spack.config.config.remove_scope(scope_name=scope_name) + spack.config.CONFIG.remove_scope(scope_name=scope_name) class MatchError(spack.error.SpackError): diff --git a/lib/spack/spack/subprocess_context.py b/lib/spack/spack/subprocess_context.py index 90d6ccb30c..f0e004e472 100644 --- a/lib/spack/spack/subprocess_context.py +++ b/lib/spack/spack/subprocess_context.py @@ -94,14 +94,14 @@ class TestState: def __init__(self): if _SERIALIZE: - self.config = spack.config.config + self.config = spack.config.CONFIG self.platform = spack.platforms.host self.test_patches = store_patches() self.store = spack.store.STORE def restore(self): if _SERIALIZE: - spack.config.config = self.config + spack.config.CONFIG = self.config spack.repo.PATH = spack.repo.create(self.config) spack.platforms.host = self.platform spack.store.STORE = self.store diff --git a/lib/spack/spack/test/bindist.py b/lib/spack/spack/test/bindist.py index b778651455..cd62f6080d 100644 --- a/lib/spack/spack/test/bindist.py +++ b/lib/spack/spack/test/bindist.py @@ -115,8 +115,8 @@ def default_config(tmpdir, config_directory, monkeypatch, install_mockery_mutabl ] ) - spack.config.config, old_config = cfg, spack.config.config - spack.config.config.set("repos", [spack.paths.mock_packages_path]) + spack.config.CONFIG, old_config = cfg, spack.config.CONFIG + spack.config.CONFIG.set("repos", [spack.paths.mock_packages_path]) njobs = spack.config.get("config:build_jobs") if not njobs: spack.config.set("config:build_jobs", 4, scope="user") @@ -138,9 +138,9 @@ def default_config(tmpdir, config_directory, monkeypatch, install_mockery_mutabl if not timeout: spack.config.set("config:connect_timeout", 10, scope="user") - yield spack.config.config + yield spack.config.CONFIG - spack.config.config = old_config + spack.config.CONFIG = old_config mutable_dir.remove() diff --git a/lib/spack/spack/test/bootstrap.py b/lib/spack/spack/test/bootstrap.py index ec4764410e..dcc8bf6495 100644 --- a/lib/spack/spack/test/bootstrap.py +++ b/lib/spack/spack/test/bootstrap.py @@ -26,11 +26,11 @@ def test_store_is_restored_correctly_after_bootstrap(mutable_config, tmpdir): user_path = str(tmpdir.join("store")) with spack.store.use_store(user_path): assert spack.store.STORE.root == user_path - assert spack.config.config.get("config:install_tree:root") == user_path + assert spack.config.CONFIG.get("config:install_tree:root") == user_path with spack.bootstrap.ensure_bootstrap_configuration(): assert spack.store.STORE.root == spack.bootstrap.config.store_path() assert spack.store.STORE.root == user_path - assert spack.config.config.get("config:install_tree:root") == user_path + assert spack.config.CONFIG.get("config:install_tree:root") == user_path @pytest.mark.regression("38963") @@ -40,11 +40,11 @@ def test_store_padding_length_is_zero_during_bootstrapping(mutable_config, tmpdi """ user_path = str(tmpdir.join("store")) with spack.store.use_store(user_path, extra_data={"padded_length": 512}): - assert spack.config.config.get("config:install_tree:padded_length") == 512 + assert spack.config.CONFIG.get("config:install_tree:padded_length") == 512 with spack.bootstrap.ensure_bootstrap_configuration(): assert spack.store.STORE.root == spack.bootstrap.config.store_path() - assert spack.config.config.get("config:install_tree:padded_length") == 0 - assert spack.config.config.get("config:install_tree:padded_length") == 512 + assert spack.config.CONFIG.get("config:install_tree:padded_length") == 0 + assert spack.config.CONFIG.get("config:install_tree:padded_length") == 512 @pytest.mark.regression("38963") @@ -54,15 +54,15 @@ def test_install_tree_customization_is_respected(mutable_config, tmp_path): """ spack.store.reinitialize() store_dir = tmp_path / "store" - spack.config.config.set("config:install_tree:root", str(store_dir)) + spack.config.CONFIG.set("config:install_tree:root", str(store_dir)) with spack.bootstrap.ensure_bootstrap_configuration(): assert spack.store.STORE.root == spack.bootstrap.config.store_path() assert ( - spack.config.config.get("config:install_tree:root") + spack.config.CONFIG.get("config:install_tree:root") == spack.bootstrap.config.store_path() ) - assert spack.config.config.get("config:install_tree:padded_length") == 0 - assert spack.config.config.get("config:install_tree:root") == str(store_dir) + assert spack.config.CONFIG.get("config:install_tree:padded_length") == 0 + assert spack.config.CONFIG.get("config:install_tree:root") == str(store_dir) assert spack.store.STORE.root == str(store_dir) @@ -185,12 +185,12 @@ def test_bootstrap_custom_store_in_environment(mutable_config, tmpdir): def test_nested_use_of_context_manager(mutable_config): """Test nested use of the context manager""" - user_config = spack.config.config + user_config = spack.config.CONFIG with spack.bootstrap.ensure_bootstrap_configuration(): - assert spack.config.config != user_config + assert spack.config.CONFIG != user_config with spack.bootstrap.ensure_bootstrap_configuration(): - assert spack.config.config != user_config - assert spack.config.config == user_config + assert spack.config.CONFIG != user_config + assert spack.config.CONFIG == user_config @pytest.mark.parametrize("expected_missing", [False, True]) diff --git a/lib/spack/spack/test/cmd/bootstrap.py b/lib/spack/spack/test/cmd/bootstrap.py index ac86729a11..fed76b1a68 100644 --- a/lib/spack/spack/test/cmd/bootstrap.py +++ b/lib/spack/spack/test/cmd/bootstrap.py @@ -50,7 +50,7 @@ def test_reset_in_file_scopes(mutable_config, scopes): bootstrap_yaml_files = [] for s in scopes: _bootstrap("disable", "--scope={0}".format(s)) - scope_path = spack.config.config.scopes[s].path + scope_path = spack.config.CONFIG.scopes[s].path bootstrap_yaml = os.path.join(scope_path, "bootstrap.yaml") assert os.path.exists(bootstrap_yaml) bootstrap_yaml_files.append(bootstrap_yaml) @@ -80,7 +80,7 @@ def test_reset_in_environment(mutable_mock_env_path, mutable_config): def test_reset_in_file_scopes_overwrites_backup_files(mutable_config): # Create a bootstrap.yaml with some config _bootstrap("disable", "--scope=site") - scope_path = spack.config.config.scopes["site"].path + scope_path = spack.config.CONFIG.scopes["site"].path bootstrap_yaml = os.path.join(scope_path, "bootstrap.yaml") assert os.path.exists(bootstrap_yaml) diff --git a/lib/spack/spack/test/cmd/config.py b/lib/spack/spack/test/cmd/config.py index 26203dbec8..4f3d5afe77 100644 --- a/lib/spack/spack/test/cmd/config.py +++ b/lib/spack/spack/test/cmd/config.py @@ -24,7 +24,7 @@ def _create_config(scope=None, data={}, section="packages"): scope = scope or spack.config.default_modify_scope() - cfg_file = spack.config.config.get_config_filename(scope, section) + cfg_file = spack.config.CONFIG.get_config_filename(scope, section) with open(cfg_file, "w") as f: syaml.dump(data, stream=f) return cfg_file @@ -80,8 +80,8 @@ def test_config_edit(mutable_config, working_env): """Ensure `spack config edit` edits the right paths.""" dms = spack.config.default_modify_scope("compilers") - dms_path = spack.config.config.scopes[dms].path - user_path = spack.config.config.scopes["user"].path + dms_path = spack.config.CONFIG.scopes[dms].path + user_path = spack.config.CONFIG.scopes["user"].path comp_path = os.path.join(dms_path, "compilers.yaml") repos_path = os.path.join(user_path, "repos.yaml") @@ -544,7 +544,7 @@ def test_config_update_not_needed(mutable_config): def test_config_update_can_handle_comments(mutable_config): # Create an outdated config file with comments scope = spack.config.default_modify_scope() - cfg_file = spack.config.config.get_config_filename(scope, "config") + cfg_file = spack.config.CONFIG.get_config_filename(scope, "config") with open(cfg_file, mode="w") as f: f.write( """ @@ -574,7 +574,7 @@ def test_config_update_can_handle_comments(mutable_config): @pytest.mark.regression("18050") def test_config_update_works_for_empty_paths(mutable_config): scope = spack.config.default_modify_scope() - cfg_file = spack.config.config.get_config_filename(scope, "config") + cfg_file = spack.config.CONFIG.get_config_filename(scope, "config") with open(cfg_file, mode="w") as f: f.write( """ @@ -627,7 +627,7 @@ def test_config_prefer_upstream( output = config("prefer-upstream") scope = spack.config.default_modify_scope("packages") - cfg_file = spack.config.config.get_config_filename(scope, "packages") + cfg_file = spack.config.CONFIG.get_config_filename(scope, "packages") packages = syaml.load(open(cfg_file))["packages"] # Make sure only the non-default variants are set. diff --git a/lib/spack/spack/test/concretize_requirements.py b/lib/spack/spack/test/concretize_requirements.py index ff0e354965..952ace56e3 100644 --- a/lib/spack/spack/test/concretize_requirements.py +++ b/lib/spack/spack/test/concretize_requirements.py @@ -937,7 +937,7 @@ def test_requires_directive(concretize_scope, mock_packages): modules: [] """ ) - spack.config.config.clear_caches() + spack.config.CONFIG.clear_caches() # This package requires either clang or gcc s = Spec("requires_clang_or_gcc").concretized() diff --git a/lib/spack/spack/test/config.py b/lib/spack/spack/test/config.py index c5deed971f..133ae2d6d1 100644 --- a/lib/spack/spack/test/config.py +++ b/lib/spack/spack/test/config.py @@ -236,7 +236,7 @@ def test_write_key_to_disk(mock_low_high_config, compiler_specs): spack.config.set("compilers", b_comps["compilers"], scope="high") # Clear caches so we're forced to read from disk. - spack.config.config.clear_caches() + spack.config.CONFIG.clear_caches() # Same check again, to ensure consistency. check_compiler_config(a_comps["compilers"], *compiler_specs.a) @@ -249,7 +249,7 @@ def test_write_to_same_priority_file(mock_low_high_config, compiler_specs): spack.config.set("compilers", b_comps["compilers"], scope="low") # Clear caches so we're forced to read from disk. - spack.config.config.clear_caches() + spack.config.CONFIG.clear_caches() # Same check again, to ensure consistency. check_compiler_config(a_comps["compilers"], *compiler_specs.a) @@ -369,7 +369,7 @@ def test_substitute_config_variables(mock_low_high_config, monkeypatch): spack.config.set( "modules:default", {"roots": {"lmod": os.path.join("foo", "bar", "baz")}}, scope="low" ) - spack.config.config.clear_caches() + spack.config.CONFIG.clear_caches() path = spack.config.get("modules:default:roots:lmod") assert spack_path.canonicalize_path(path) == os.path.normpath( os.path.join(mock_low_high_config.scopes["low"].path, os.path.join("foo", "bar", "baz")) @@ -854,18 +854,18 @@ def test_add_command_line_scopes(tmpdir, mutable_config): def test_nested_override(): """Ensure proper scope naming of nested overrides.""" - base_name = spack.config.overrides_base_name + base_name = spack.config._OVERRIDES_BASE_NAME def _check_scopes(num_expected, debug_values): scope_names = [ - s.name for s in spack.config.config.scopes.values() if s.name.startswith(base_name) + s.name for s in spack.config.CONFIG.scopes.values() if s.name.startswith(base_name) ] for i in range(num_expected): name = "{0}{1}".format(base_name, i) assert name in scope_names - data = spack.config.config.get_config("config", name) + data = spack.config.CONFIG.get_config("config", name) assert data["debug"] == debug_values[i] # Check results from single and nested override @@ -878,23 +878,23 @@ def _check_scopes(num_expected, debug_values): def test_alternate_override(monkeypatch): """Ensure proper scope naming of override when conflict present.""" - base_name = spack.config.overrides_base_name + base_name = spack.config._OVERRIDES_BASE_NAME def _matching_scopes(regexpr): return [spack.config.InternalConfigScope("{0}1".format(base_name))] # Check that the alternate naming works - monkeypatch.setattr(spack.config.config, "matching_scopes", _matching_scopes) + monkeypatch.setattr(spack.config.CONFIG, "matching_scopes", _matching_scopes) with spack.config.override("config:debug", False): name = "{0}2".format(base_name) scope_names = [ - s.name for s in spack.config.config.scopes.values() if s.name.startswith(base_name) + s.name for s in spack.config.CONFIG.scopes.values() if s.name.startswith(base_name) ] assert name in scope_names - data = spack.config.config.get_config("config", name) + data = spack.config.CONFIG.get_config("config", name) assert data["debug"] is False diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index 651174f9fb..6f771c14d5 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -716,7 +716,7 @@ def configuration_dir(tmpdir_factory, linux_os): def _create_mock_configuration_scopes(configuration_dir): """Create the configuration scopes used in `config` and `mutable_config`.""" - scopes = [spack.config.InternalConfigScope("_builtin", spack.config.config_defaults)] + scopes = [spack.config.InternalConfigScope("_builtin", spack.config.CONFIG_DEFAULTS)] scopes += [ spack.config.ConfigScope(name, str(configuration_dir.join(name))) for name in ["site", "system", "user"] @@ -1935,7 +1935,7 @@ def shell_as(shell): @pytest.fixture() def nullify_globals(request, monkeypatch): ensure_configuration_fixture_run_before(request) - monkeypatch.setattr(spack.config, "config", None) + monkeypatch.setattr(spack.config, "CONFIG", None) monkeypatch.setattr(spack.caches, "misc_cache", None) monkeypatch.setattr(spack.repo, "PATH", None) monkeypatch.setattr(spack.store, "STORE", None) diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py index 34c87d66ef..467577cead 100644 --- a/lib/spack/spack/test/install.py +++ b/lib/spack/spack/test/install.py @@ -288,7 +288,7 @@ def install_upstream(tmpdir_factory, gen_mock_layout, install_mockery): mock_db_root = str(tmpdir_factory.mktemp("mock_db_root")) prepared_db = spack.database.Database(mock_db_root) upstream_layout = gen_mock_layout("/a/") - spack.config.config.push_scope( + spack.config.CONFIG.push_scope( spack.config.InternalConfigScope( name="install-upstream-fixture", data={"upstreams": {"mock1": {"install_tree": prepared_db.root}}}, diff --git a/lib/spack/spack/test/modules/conftest.py b/lib/spack/spack/test/modules/conftest.py index e6dfc024e2..210a88a65f 100644 --- a/lib/spack/spack/test/modules/conftest.py +++ b/lib/spack/spack/test/modules/conftest.py @@ -39,14 +39,6 @@ def _impl(spec_str, module_set_name="default", explicit=True): return _impl -@pytest.fixture() -def update_template_dirs(config, monkeypatch): - """Mocks the template directories for tests""" - dirs = spack.config.get_config("config")["template_dirs"] - dirs = [spack.util.path.canonicalize_path(x) for x in dirs] - monkeypatch.setattr(spack, "template_dirs", dirs) - - @pytest.fixture() def factory(request): """Function that, given a spec string, returns an instance of the writer