mirror of
https://gitlab.com/kupfer/kupferbootstrap.git
synced 2025-02-23 05:35:44 -05:00
Add config init
and config profile init
This commit is contained in:
parent
bae5fbc272
commit
33dd19a533
1 changed files with 95 additions and 3 deletions
98
config.py
98
config.py
|
@ -43,6 +43,7 @@ CONFIG_DEFAULTS = {
|
||||||
'default': deepcopy(PROFILE_DEFAULTS),
|
'default': deepcopy(PROFILE_DEFAULTS),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
CONFIG_SECTIONS = list(CONFIG_DEFAULTS.keys())
|
||||||
|
|
||||||
CONFIG_RUNTIME_DEFAULTS = {
|
CONFIG_RUNTIME_DEFAULTS = {
|
||||||
'verbose': False,
|
'verbose': False,
|
||||||
|
@ -286,15 +287,26 @@ class ConfigStateHolder:
|
||||||
return os.path.join(self.get_path('packages'), arch)
|
return os.path.join(self.get_path('packages'), arch)
|
||||||
|
|
||||||
def dump(self) -> str:
|
def dump(self) -> str:
|
||||||
|
"""dump toml representation of `self.file`"""
|
||||||
dump_toml(self.file)
|
dump_toml(self.file)
|
||||||
|
|
||||||
def write(self, path=None):
|
def write(self, path=None):
|
||||||
|
"""write toml representation of `self.file` to `path`"""
|
||||||
if path is None:
|
if path is None:
|
||||||
path = self.runtime['config_file']
|
path = self.runtime['config_file']
|
||||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||||
dump_file(path, self.file)
|
dump_file(path, self.file)
|
||||||
logging.info(f'Created config file at {path}')
|
logging.info(f'Created config file at {path}')
|
||||||
|
|
||||||
|
def invalidate_profile_cache(self):
|
||||||
|
"""Clear the profile cache (usually after modification)"""
|
||||||
|
self._profile_cache = None
|
||||||
|
|
||||||
|
def update(self, config_fragment: dict[str, dict]):
|
||||||
|
if 'profiles' in config_fragment and self.file['profiles'] != config_fragment['profiles']:
|
||||||
|
self.invalidate_profile_cache()
|
||||||
|
self.file = merge_configs(config_fragment, conf_base=self.file)
|
||||||
|
|
||||||
|
|
||||||
config = ConfigStateHolder(file_conf_base=CONFIG_DEFAULTS)
|
config = ConfigStateHolder(file_conf_base=CONFIG_DEFAULTS)
|
||||||
|
|
||||||
|
@ -311,11 +323,91 @@ def cmd_config():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
noninterace_flag = click.option('--non-interactive', is_flag=True)
|
||||||
|
noop_flag = click.option('--noop', '-n', is_flag=True)
|
||||||
|
|
||||||
|
|
||||||
@cmd_config.command(name='init')
|
@cmd_config.command(name='init')
|
||||||
def cmd_init():
|
@noninterace_flag
|
||||||
|
@noop_flag
|
||||||
|
@click.option(
|
||||||
|
'--sections',
|
||||||
|
'-s',
|
||||||
|
multiple=True,
|
||||||
|
type=click.Choice(CONFIG_SECTIONS),
|
||||||
|
default=CONFIG_SECTIONS,
|
||||||
|
show_choices=True,
|
||||||
|
)
|
||||||
|
def cmd_config_init(sections: list[str] = CONFIG_SECTIONS, non_interactive: bool = False, noop: bool = False):
|
||||||
"""Initialize the config file"""
|
"""Initialize the config file"""
|
||||||
# TODO
|
if not non_interactive:
|
||||||
config.write()
|
results = {}
|
||||||
|
for section in set(sections) - set(['profiles']):
|
||||||
|
results[section] = {}
|
||||||
|
for key, current in config.file[section].items():
|
||||||
|
result = config_prompt(key, current, type(current))
|
||||||
|
if result:
|
||||||
|
print(f'{key} = {result}')
|
||||||
|
results[section][key] = result
|
||||||
|
|
||||||
|
if 'profiles' in sections:
|
||||||
|
cmd_profile_init.callback(config.file['profiles']['current'], noop=noop, non_interactive=non_interactive)
|
||||||
|
pass
|
||||||
|
config.update(results)
|
||||||
|
if not noop:
|
||||||
|
if not click.confirm(f'Do you want to save your changes to {config.runtime["config_file"]}?'):
|
||||||
|
return
|
||||||
|
|
||||||
|
if not noop:
|
||||||
|
config.write()
|
||||||
|
else:
|
||||||
|
logging.info('--noop passed, not writing to file!')
|
||||||
|
|
||||||
|
|
||||||
|
@cmd_config.group(name='profile')
|
||||||
|
def cmd_profile():
|
||||||
|
"""Manage config profiles"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def list_to_comma_str(l: list[str]) -> str:
|
||||||
|
return ','.join(l if l else [])
|
||||||
|
|
||||||
|
|
||||||
|
def comma_str_to_list(s: str) -> list[str]:
|
||||||
|
return [a for a in s.split(',') if a]
|
||||||
|
|
||||||
|
|
||||||
|
def config_prompt(key, default, type):
|
||||||
|
if type == list:
|
||||||
|
default = list_to_comma_str(default)
|
||||||
|
result = comma_str_to_list(click.prompt(key.capitalize(), default=default, show_default=True))
|
||||||
|
else:
|
||||||
|
default = '' if not default else default
|
||||||
|
result = click.prompt(key.capitalize(), type=str, default=default, show_default=True)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
@cmd_profile.command(name='init')
|
||||||
|
@noninterace_flag
|
||||||
|
@noop_flag
|
||||||
|
@click.argument('name', required=False)
|
||||||
|
def cmd_profile_init(name: str = None, non_interactive: bool = False, noop: bool = False):
|
||||||
|
"""Create or edit a profile"""
|
||||||
|
profile = {key: None for key in PROFILE_DEFAULTS.keys()}
|
||||||
|
# don't use get_profile() here because we need the sparse profile
|
||||||
|
if name in config.file['profiles']:
|
||||||
|
profile |= config.file['profiles'][name]
|
||||||
|
else:
|
||||||
|
logging.info(f"Profile {name} doesn't exist yet, creating new profile.")
|
||||||
|
|
||||||
|
logging.info(f'Configuring profile "{name}"')
|
||||||
|
for key, current in profile.items():
|
||||||
|
result = config_prompt(key, profile[key], type(PROFILE_DEFAULTS[key]))
|
||||||
|
if result:
|
||||||
|
print(f'{key} = {result}')
|
||||||
|
profile[key] = result
|
||||||
|
|
||||||
|
|
||||||
# temporary demo
|
# temporary demo
|
||||||
|
|
Loading…
Add table
Reference in a new issue