Skip to content

Commit 15e2c43

Browse files
committed
Make sure positional arguments for F() are only accepted for And/Or
Fixes elastic#17, thanks Benoss!
1 parent b0a6ba1 commit 15e2c43

File tree

2 files changed

+10
-0
lines changed

2 files changed

+10
-0
lines changed

elasticsearch_dsl/filter.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
def F(name_or_filter, filters=None, **params):
44
# 'and/or', [F(), F()]
55
if filters is not None:
6+
# someone passed in positional argument to F outside of and/or
7+
if name_or_filter not in ('and', 'or'):
8+
raise ValueError("Filter %r doesn't accept argument 'filters'." % name_or_filter)
69
params['filters'] = filters
710

811
# {"term": {...}}

test_elasticsearch_dsl/test_filter.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
from elasticsearch_dsl import filter
22

3+
from pytest import raises
4+
35
def test_and_can_be_created_with_a_list():
46
f = filter.F('and', [filter.F('term', field='value')])
57

68
assert isinstance(f, filter.And)
79
assert f.filters == [filter.F('term', field='value')]
810

11+
def test_other_filters_must_use_kwargs():
12+
with raises(ValueError):
13+
filter.F('bool', [filter.F('term', field='value')])
14+
915
def test_not_doesnt_have_to_wrap_filter():
1016
f = filter.F('not', term={'field': 'value'})
1117

1218
assert isinstance(f, filter.Not)
1319
assert f.filter == filter.F('term', field='value')
20+

0 commit comments

Comments
 (0)