add optional in dynoption

This commit is contained in:
egarette@silique.fr 2023-03-02 10:33:24 +01:00
parent add176331e
commit a36d3cb9bf
3 changed files with 47 additions and 20 deletions

View file

@ -42,7 +42,6 @@ def calc_disk_usage(path, size='bytes'):
# do not calc if path is None # do not calc if path is None
if path is None: if path is None:
return None return None
if size == 'bytes': if size == 'bytes':
div = 1 div = 1
else: else:
@ -60,12 +59,13 @@ usage = FloatOption('usage', 'Disk usage', Calculation(calc_disk_usage,
Finally add those options in option description and a Config: Finally add those options in option description and a Config:
``` ```python
disk = OptionDescription('disk', 'Verify disk usage', [filename, usage]) disk = OptionDescription('disk', 'Verify disk usage', [filename, usage])
root = OptionDescription('root', 'root', [disk]) root = OptionDescription('root', 'root', [disk])
async def main(): async def main():
config = await Config(root) config = await Config(root)
await config.property.read_write() await config.property.read_write()
return config
config = run(main()) config = run(main())
``` ```
@ -109,26 +109,29 @@ returns:
When you enter a value it is validated: When you enter a value it is validated:
>>> try: ```python
>>> config.option('disk.path').value.set('/unknown') async def main():
>>> except ValueError as err: try:
>>> print(err) await config.option('disk.path').value.set('/unknown')
except ValueError as err:
print(err)
run(main())
```
returns:
```
"/unknown" is an invalid file name for "Path", this directory does not exist "/unknown" is an invalid file name for "Path", this directory does not exist
```
We can also set a :doc:`calculation` as value. For example, we want to launch previous function but with in_gb to True as second argument:
>>> calc = Calculation(calc_disk_usage, Params((ParamOption(filename),
... ParamValue('gigabytes'))))
>>> config.option('disk.usage').value.set(calc)
>>> config.option('disk.usage').value.get()
622.6080360412598
#### Is value is valid? #### Is value is valid?
To check is a value is valid: To check is a value is valid:
>>> config.option('disk.path').value.valid() ```python
True await config.option('disk.path').value.valid()
```
#### Display the default value #### Display the default value

View file

@ -471,6 +471,22 @@ from tiramisu import FilenameOption
FilenameOption('file', 'file', '/etc/tiramisu/tiramisu.conf') FilenameOption('file', 'file', '/etc/tiramisu/tiramisu.conf')
``` ```
## Unix file permissions: PermissionsOption
Valid the representing Unix permissions is an octal (base-8) notation.
```python
from tiramisu import PermissionsOption
PermissionsOption('perms', 'perms', 755)
PermissionsOption('perms', 'perms', 1755)
```
This option doesn't allow (or display a warning with warnings_only):
- 777 (two weak value)
- others have more right than group
- group has more right than user
# Date option # Date option
## Date option: DateOption ## Date option: DateOption

View file

@ -90,6 +90,7 @@ class ParamDynOption(ParamOption):
dynoptiondescription: 'DynOptionDescription', dynoptiondescription: 'DynOptionDescription',
notraisepropertyerror: bool=False, notraisepropertyerror: bool=False,
raisepropertyerror: bool=False, raisepropertyerror: bool=False,
optional: bool=False,
todict: bool=False, todict: bool=False,
) -> None: ) -> None:
super().__init__(option, super().__init__(option,
@ -99,6 +100,7 @@ class ParamDynOption(ParamOption):
) )
self.suffix = suffix self.suffix = suffix
self.dynoptiondescription = dynoptiondescription self.dynoptiondescription = dynoptiondescription
self.optional = optional
class ParamSelfOption(Param): class ParamSelfOption(Param):
@ -273,13 +275,19 @@ async def manager_callback(callbk: Param,
except PropertiesOptionError as err: except PropertiesOptionError as err:
# raise PropertiesOptionError (which is catched) because must not add value None in carry_out_calculation # raise PropertiesOptionError (which is catched) because must not add value None in carry_out_calculation
if callbk.notraisepropertyerror or callbk.raisepropertyerror: if callbk.notraisepropertyerror or callbk.raisepropertyerror:
raise err raise err from err
raise ConfigError(_('unable to carry out a calculation for "{}"' raise ConfigError(_('unable to carry out a calculation for "{}"'
', {}').format(option.impl_get_display_name(), err), err) ', {}').format(option.impl_get_display_name(), err), err) from err
except ValueError as err: except ValueError as err:
raise ValueError(_('the option "{0}" is used in a calculation but is invalid ({1})').format(option_bag.option.impl_get_display_name(), err)) raise ValueError(_('the option "{0}" is used in a calculation but is invalid ({1})').format(option_bag.option.impl_get_display_name(), err)) from err
except AttributeError as err: except AttributeError as err:
raise ConfigError(_(f'unable to get value for calculating "{option_bag.option.impl_get_display_name()}", {err}')) if isinstance(callbk, ParamDynOption) and callbk.optional:
# cannot acces, simulate a propertyerror
raise PropertiesOptionError(option_bag,
['configerror'],
config_bag.context.cfgimpl_get_settings(),
)
raise ConfigError(_(f'unable to get value for calculating "{option_bag.option.impl_get_display_name()}", {err}')) from err
return value return value
async def get_option_bag(config_bag, async def get_option_bag(config_bag,