Welcome to Brabbel’s documentation!

Getting Started

About

Brabbel is a small expression language able to do some evaluations on a given set of values.

Brabbel is the German description for the first “language” of a baby and should emphasise the limited capabilities of the language.

Installation

Formbar is available as Pypi package. To install it use the following command:

<venv> pip install brabbel

The source is availble on Bitbucket. You can check of the source and install the library with the following command:

(venv)> hg clone https://bitbucket.org/ti/brabbel
(venv)> cd brabbel

Quickstart

Here is a short example on how to use brabbel:

from brabbel import Expression
expr = Expression("$foo < $bar")
values = {"foo": 1, "bar": 2}
expr.evaluate(values)
-> True

License

Brabbel is licensed with under the GNU General Public License version >= 2.

Authors

Torsten Irländer <torsten at irlaender dot de>

Language

Types

Number

Number in general means float and integers. If possible the given value will be casted into integer. If casting fails the value will be tried to converted into a float value.

>>> expr = "10"
>>> Expression(expr).evaluate()
10
>>> expr = "10.0"
>>> Expression(expr).evaluate()
10.0
>>> expr = "0"
>>> Expression(expr).evaluate()
0
>>> expr = "0.0"
>>> Expression(expr).evaluate()
0
>>> expr = "012"
>>> Expression(expr).evaluate()
12

String

All String are handled internally as a unicode string. Actually they will be encoded on parsing to ensure that they are unicode.

Note

Strings currently only have a limited subset of chars.

BNF:
lquote ::= "'"
rquote ::= lquote
char   ::= a .. z | A .. Z | "  " | "-" | "_" | ":"
chars  ::= char | char chars
string ::= lquote + chars + rquote
Examples:
>>> expr = "'Foo'"
>>> Expression(expr).evaluate()
u'Foo'
>>> expr = "'Foo Bar'"
>>> Expression(expr).evaluate()
u'Foo Bar'

Listings

BNF:
lbr     ::= "["
rbr     ::= rbr
item    ::= string | number
items   ::= item | "," + item  items
listing ::= lbr + items + rbr
Examples:
>>> expr = "[1, 2, 'foo', '42', 23]"
>>> Expression(expr).evaluate()
[1, 2, u'foo', u'42', 23]

Variables

Variables can be used as placeholder for dynamically injected values when evaluating the expression.

BNF:
varsign  ::= "$"
char     ::= a .. z | A .. Z | "_"
chars    ::= char | char chars
variable ::= varsign + chars
Examples:
>>> rule = "$foo < $bar"
>>> values = {'foo': 23, 'bar': 42}
>>> Expression(rule).evaluate(values)
True

The variables $foo and $bar will be replaced by the values in the values dictionary before the rule gets evaluated.

Constants

True

Will be converted into the Python “True” value.

>>> rule = "True == ($foo < $bar)"
>>> values = {'foo': 23, 'bar': 42}
>>> Expression(rule).evaluate(values)
True
False

Will be converted into the Python “False” value.

>>> rule = "False == ($foo > $bar)"
>>> values = {'foo': 23, 'bar': 42}
>>> Expression(rule).evaluate(values)
True
None

Will be converted into the Python “False” value.

Operators

The following operators are supported:

Important

In general the operands of the operators must be of the same type! Otherwise a TypeError will be raised. So Comparison of String and Integer values can not be done. This is escpesially important for None values. See Handling None values.

And

operator.and_()

and_(a, b) – Same as a & b.

Or

operator.or_()

or_(a, b) – Same as a | b.

Not

operator.not_()

not_(a) – Same as not a.

==

operator.eq()

eq(a, b) – Same as a==b.

!=

operator.ne()

ne(a, b) – Same as a!=b.

>

operator.lt()

lt(a, b) – Same as a<b.

>=

operator.le()

le(a, b) – Same as a<=b.

<

operator.lt()

lt(a, b) – Same as a<b.

<=

operator.le()

le(a, b) – Same as a<=b.

+

operator.add()

add(a, b) – Same as a + b.

-

operator.sub()

sub(a, b) – Same as a - b.

*

operator.mul()

mul(a, b) – Same as a * b.

/

In

Functions

Bool

Date

Len

Timedelta

Brabbel Pitfalls

Brabbel is not perfect. There are a number things where the Language might not behave as expected. This can become a pitfall in some cases so this section will list some of them. If you know more please write me an Email so I can add these here.

Handling None values

Because Brabbel can only use the operators with operands of the same type you must take care to handle the case that some of the values in an Expression may be None. This will fail if ‘$foo’ is None:

$foo < date('today')

Please handle possible None values this way:

not bool($foo) or $foo < date('today')

None Constant

Currently the None constant will actually be converted into False.

Indices and tables