def make_expr(prop_set, rhs, boolean_properties=None): """Create an AST that returns the value ``status`` given all the properties in prop_set match. :param prop_set: tuple of (property name, value) pairs for each property in this expression and the value it must match :param status: Status on RHS when all the given properties match :param boolean_properties: Set of properties in property_order that should be treated as boolean. """ root = ConditionalNode() assert len(prop_set) > 0 expressions = [] for prop, value in prop_set: number_types = (int, float, long) value_cls = (NumberNode if type(value) in number_types else StringNode) if prop not in boolean_properties: expressions.append( BinaryExpressionNode( BinaryOperatorNode("=="), VariableNode(prop), value_cls(unicode(value)) )) else: if value: expressions.append(VariableNode(prop)) else: expressions.append( UnaryExpressionNode( UnaryOperatorNode("not"), VariableNode(prop) )) if len(expressions) > 1: prev = expressions[-1] for curr in reversed(expressions[:-1]): node = BinaryExpressionNode( BinaryOperatorNode("and"), curr, prev) prev = node else: node = expressions[0] root.append(node) if type(rhs) in number_types: rhs_node = NumberNode(rhs) else: rhs_node = StringNode(rhs) root.append(rhs_node) return root
def make_node(value): if type(value) in (int, float, long): node = NumberNode(value) elif type(value) in (str, unicode): node = StringNode(unicode(value)) elif hasattr(value, "__iter__"): node = ListNode() for item in value: node.append(make_node(item)) return node