manage callback with unrestraint

This commit is contained in:
Emmanuel Garette 2021-03-08 06:39:40 +01:00
parent 2f173af70f
commit 200562d23c
3 changed files with 45 additions and 11 deletions

View File

@ -1298,6 +1298,21 @@ async def test_callback_calculating_invalid():
assert not await list_sessions() assert not await list_sessions()
@pytest.mark.asyncio
async def test_callback_unrestraint():
opt1 = IntOption('opt1', '', 1)
opt2 = IntOption('opt2', '', Calculation(return_value, Params(ParamOption(opt1))))
od1 = OptionDescription('od1', '', [opt1], properties=('disabled',))
od2 = OptionDescription('od2', '', [opt2])
maconfig = OptionDescription('rootconfig', '', [od1, od2])
async with await Config(maconfig) as cfg:
await cfg.property.read_write()
with pytest.raises(ConfigError):
await cfg.option('od2.opt2').value.get()
assert await cfg.unrestraint.option('od2.opt2').value.get() == 1
assert not await list_sessions()
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_callback_calculating_disabled(): async def test_callback_calculating_disabled():
opt1 = BoolOption('opt1', '', properties=('disabled',)) opt1 = BoolOption('opt1', '', properties=('disabled',))

View File

@ -170,8 +170,9 @@ class Calculation:
option_bag: OptionBag, option_bag: OptionBag,
leadership_must_have_index: bool=False, leadership_must_have_index: bool=False,
orig_value: Any=undefined, orig_value: Any=undefined,
allow_value_error=False, allow_value_error: bool=False,
force_value_warning=False, force_value_warning: bool=False,
for_settings: bool=False,
) -> Any: ) -> Any:
return await carry_out_calculation(option_bag.option, return await carry_out_calculation(option_bag.option,
callback=self.function, callback=self.function,
@ -182,20 +183,27 @@ class Calculation:
orig_value=orig_value, orig_value=orig_value,
allow_value_error=allow_value_error, allow_value_error=allow_value_error,
force_value_warning=force_value_warning, force_value_warning=force_value_warning,
for_settings=for_settings,
) )
async def help(self, async def help(self,
option_bag: OptionBag, option_bag: OptionBag,
leadership_must_have_index: bool=False) -> str: leadership_must_have_index: bool=False,
for_settings: bool=False,
) -> str:
if not self.help_function: if not self.help_function:
return await self.execute(option_bag, return await self.execute(option_bag,
leadership_must_have_index=leadership_must_have_index) leadership_must_have_index=leadership_must_have_index,
for_settings=for_settings,
)
return await carry_out_calculation(option_bag.option, return await carry_out_calculation(option_bag.option,
callback=self.help_function, callback=self.help_function,
callback_params=self.params, callback_params=self.params,
index=option_bag.index, index=option_bag.index,
config_bag=option_bag.config_bag, config_bag=option_bag.config_bag,
leadership_must_have_index=leadership_must_have_index) leadership_must_have_index=leadership_must_have_index,
for_settings=for_settings,
)
def has_index(self, current_option): def has_index(self, current_option):
if hasattr(self, '_has_index'): if hasattr(self, '_has_index'):
@ -218,7 +226,9 @@ async def manager_callback(callbk: Param,
index: Optional[int], index: Optional[int],
orig_value, orig_value,
config_bag: ConfigBag, config_bag: ConfigBag,
leadership_must_have_index: bool) -> Any: leadership_must_have_index: bool,
for_settings: bool,
) -> Any:
"""replace Param by true value""" """replace Param by true value"""
def calc_index(callbk, index, same_leadership): def calc_index(callbk, index, same_leadership):
if index is not None: if index is not None:
@ -280,9 +290,11 @@ async def manager_callback(callbk: Param,
self_calc): self_calc):
# don't validate if option is option that we tried to validate # don't validate if option is option that we tried to validate
config_bag = config_bag.copy() config_bag = config_bag.copy()
if for_settings:
config_bag.properties = config_bag.true_properties - {'warnings'} config_bag.properties = config_bag.true_properties - {'warnings'}
config_bag.set_permissive() config_bag.set_permissive()
#config_bag.properties -= {'warnings'} if not for_settings:
config_bag.properties -= {'warnings'}
option_bag = OptionBag() option_bag = OptionBag()
option_bag.set_option(opt, option_bag.set_option(opt,
index_, index_,
@ -401,6 +413,7 @@ async def carry_out_calculation(option,
leadership_must_have_index: bool=False, leadership_must_have_index: bool=False,
allow_value_error: bool=False, allow_value_error: bool=False,
force_value_warning: bool=False, force_value_warning: bool=False,
for_settings: bool=False,
): ):
"""a function that carries out a calculation for an option's value """a function that carries out a calculation for an option's value
@ -430,7 +443,9 @@ async def carry_out_calculation(option,
index, index,
orig_value, orig_value,
config_bag, config_bag,
leadership_must_have_index) leadership_must_have_index,
for_settings,
)
if value is undefined: if value is undefined:
return undefined return undefined
if key is None: if key is None:

View File

@ -459,10 +459,14 @@ class Settings(object):
elif apply_requires: elif apply_requires:
if not help_property: if not help_property:
new_prop = await prop.execute(option_bag, new_prop = await prop.execute(option_bag,
leadership_must_have_index=True) leadership_must_have_index=True,
for_settings=True,
)
else: else:
new_prop = await prop.help(option_bag, new_prop = await prop.help(option_bag,
leadership_must_have_index=True) leadership_must_have_index=True,
for_settings=True,
)
if isinstance(new_prop, str): if isinstance(new_prop, str):
new_prop = (new_prop, new_prop) new_prop = (new_prop, new_prop)
if new_prop is None: if new_prop is None: