Source code for policy_expression_spec

from hypothesis.strategies import text, composite, sampled_from, characters, one_of, integers
from functools import partial


[docs] def policy_expressions_of_size(policy_expression_strategy, num_leaves): if num_leaves == 1: return one_of(attributes(), inequalities()) else: return policy_expression_strategy(num_leaves)
[docs] @composite def monotonic_policy_expression(draw, num_leaves): left_leaves = draw(integers(min_value=1, max_value=num_leaves - 1)) right_leaves = num_leaves - left_leaves left = draw(monotonic_policy_expressions_of_size(left_leaves)) right = draw(monotonic_policy_expressions_of_size(right_leaves)) gate = draw(gates()) return u'(' + u' '.join((left, gate, right)) + u')'
[docs] @composite def alland_policy_expression(draw, num_leaves): left_leaves = draw(integers(min_value=1, max_value=num_leaves - 1)) right_leaves = num_leaves - left_leaves left = draw(alland_policy_expressions_of_size(left_leaves)) right = draw(alland_policy_expressions_of_size(right_leaves)) gate = draw(and_gates()) return u'(' + u' '.join((left, gate, right)) + u')'
monotonic_policy_expressions_of_size = partial(policy_expressions_of_size, monotonic_policy_expression) alland_policy_expressions_of_size = partial(policy_expressions_of_size, alland_policy_expression)
[docs] def policy_expressions(min_leaves=1, max_leaves=25): return integers(min_leaves, max_leaves).flatmap(monotonic_policy_expressions_of_size)
[docs] def alland_policy_expressions(min_leaves=1, max_leaves=25): return integers(min_leaves, max_leaves).flatmap(alland_policy_expressions_of_size)
[docs] def attributes(): return text(min_size=1, alphabet=characters(whitelist_categories='L', max_codepoint=0x7e))
[docs] @composite def inequalities(draw): attr = draw(attributes()) oper = draw(inequality_operators()) numb = draw(integers(min_value=1)) return u' '.join((attr, oper, str(numb)))
[docs] def inequality_operators(): return sampled_from((u'<', u'>', u'<=', u'>='))
[docs] def gates(): return sampled_from((u'or', u'and'))
[docs] def and_gates(): return sampled_from((u'and',))
[docs] def assert_valid(policy_expression): assert policy_expression # not empty assert policy_expression.count(u'(') == policy_expression.count(u')')