Library for a filter DSL in python
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
Johann Schmitz a663b37473
Updated setup.py to include pyparsing as a dependency
4 lat temu
src/phylter Fixed a bug where a string value would not be unqouted 4 lat temu
tests Fixed a bug where a string value would not be unqouted 4 lat temu
.gitignore Initial code commit 4 lat temu
.travis.yml Updated .travis.yml 4 lat temu
LICENSE.txt Initial commit 4 lat temu
Makefile Initial commit 4 lat temu
README.md Updated README 4 lat temu
requirements.txt Initial code commit 4 lat temu
requirements_dev.txt Initial commit 4 lat temu
requirements_optional.txt Added DjangoBackend, refactored other code 4 lat temu
setup.py Updated setup.py to include pyparsing as a dependency 4 lat temu

README.md

phylter

Build Status Coverage Status

phylter is a mini-dsl filter language. You can use it to allow users to write there own filters without letting them access your database directly (and thus, need to understand your database layout).

Language

The language implements the following operators: == (equals), > (greater than), < (less than), >= (greater than or equals), <= (less than or equals) and the two operators and and or.

The precende of the and and or operator follows the python operator precedence.

Basic usage

from phylter import parser

parser = parser.Parser()
query = parser.parse("foo == 'bar'")

query.apply(data)

The query is passed as string to a Parser instance which builds a Query object. The apply method applies the query to the passed iterable using the most appropiate backend (see below).

Backends

The Query's apply method decides the best backend to use based on the type of the passed iterable. As a fallback, the ObjectsBackend will be used.

The most universal backend is the ObjectsBackend. This backend applies the query to standard python objects.

The DjangoBackend will be used if the iterable argument of the apply method is a Django QuerySet or Manager instance. The DjangoBackend translates the Query object into a Django database query:

class Person(models.Model):
    first_name = models.CharField(...)
    last_name = models.CharField(...)
    age = models.PositiveIntegerField(...)

query = Parser().parse("first_name == 'Alice')   
query.apply(Person.objects)

will result in a Django query roughly equivalent to

Person.objects.filter(first_name='Alice')

and a query like first_name == 'Bob' or age > 20 in

Person.objects.filter(Q(first_name='Bob') | Q(age__gt=20))

License

See LICENSE.txt