Added changedAll and changedAny functions for yaql

This functions will help to simplify yaql condition in library tasks

Change-Id: I67f428f1c51ecd9bef6f0b8fe9899bec4f6a3e06
Closes-Bug: 1566727
This commit is contained in:
Bulat Gaifullin 2016-04-06 00:49:44 +03:00
parent 7e1d537e8e
commit 6ac98f58a1
2 changed files with 19 additions and 0 deletions

View File

@ -125,6 +125,11 @@ class TestYaqlExt(BaseUnitTest):
self.evaluate('changed($.configs.nova.value2)', variables)
)
def test_changed_many(self):
expressions = '$.configs.nova.value, $.configs.nova.value2'
self.assertTrue(self.evaluate('changedAny({0})'.format(expressions)))
self.assertFalse(self.evaluate('changedAll({0})'.format(expressions)))
def test_undefined(self):
variables = self.variables.copy()
variables['$%old'] = {}

View File

@ -50,6 +50,18 @@ def changed(finalizer, expression, context):
return new_data != old_data
@specs.parameter('expressions', yaqltypes.Lambda())
@specs.inject('finalizer', yaqltypes.Delegate('#finalize'))
def changed_all(finalizer, context, *expressions):
return all(changed(finalizer, exp, context) for exp in expressions)
@specs.parameter('expressions', yaqltypes.Lambda())
@specs.inject('finalizer', yaqltypes.Delegate('#finalize'))
def changed_any(finalizer, context, *expressions):
return any(changed(finalizer, exp, context) for exp in expressions)
def get_limited_if_need(data, engine):
if (yaqlutils.is_iterable(data) or yaqlutils.is_sequence(data) or
isinstance(data, (yaqlutils.MappingType, yaqlutils.SetType))):
@ -84,6 +96,8 @@ def register(context):
context.register_function(get_new, name='new')
context.register_function(get_old, name='old')
context.register_function(changed)
context.register_function(changed_all)
context.register_function(changed_any)
context.register_function(added)
context.register_function(deleted)
context.register_function(is_undef)