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),
|
||||
},
|
||||
}
|
||||
CONFIG_SECTIONS = list(CONFIG_DEFAULTS.keys())
|
||||
|
||||
CONFIG_RUNTIME_DEFAULTS = {
|
||||
'verbose': False,
|
||||
|
@ -286,15 +287,26 @@ class ConfigStateHolder:
|
|||
return os.path.join(self.get_path('packages'), arch)
|
||||
|
||||
def dump(self) -> str:
|
||||
"""dump toml representation of `self.file`"""
|
||||
dump_toml(self.file)
|
||||
|
||||
def write(self, path=None):
|
||||
"""write toml representation of `self.file` to `path`"""
|
||||
if path is None:
|
||||
path = self.runtime['config_file']
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
dump_file(path, self.file)
|
||||
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)
|
||||
|
||||
|
@ -311,11 +323,91 @@ def cmd_config():
|
|||
pass
|
||||
|
||||
|
||||
noninterace_flag = click.option('--non-interactive', is_flag=True)
|
||||
noop_flag = click.option('--noop', '-n', is_flag=True)
|
||||
|
||||
|
||||
@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"""
|
||||
# TODO
|
||||
config.write()
|
||||
if not non_interactive:
|
||||
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
|
||||
|
|
Loading…
Add table
Reference in a new issue