Skip to content

Commit

Permalink
Merge pull request #158 from HubSpot/select-filter-args
Browse files Browse the repository at this point in the history
support expression tests for select filter that use arguments
  • Loading branch information
boulter authored Nov 11, 2017
2 parents 2e4a6ea + 79a2b8a commit b4df68c
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@ public String getName() {
}

@Override
public boolean evaluate(Object var, JinjavaInterpreter interpreter,
Object... args) {
public boolean evaluate(Object var, JinjavaInterpreter interpreter, Object... args) {
if (args.length == 0) {
throw new InterpretException(getName() + " test requires 1 argument");
}
Expand Down
16 changes: 12 additions & 4 deletions src/main/java/com/hubspot/jinjava/lib/filter/SelectFilter.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.hubspot.jinjava.lib.filter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
Expand All @@ -23,22 +25,28 @@
code = "{% set some_numbers = [10, 12, 13, 3, 5, 17, 22] %}\n" +
"{% some_numbers|select('even') %}")
})
public class SelectFilter implements Filter {
public class SelectFilter implements AdvancedFilter {

@Override
public String getName() {
return "select";
}

@Override
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
public Object filter(Object var, JinjavaInterpreter interpreter, Object[] args, Map<String, Object> kwargs) {
List<Object> result = new ArrayList<>();

if (args.length == 0) {
throw new InterpretException(getName() + " requires an exp test to filter on", interpreter.getLineNumber());
}

ExpTest expTest = interpreter.getContext().getExpTest(args[0]);
Object[] expArgs = new Object[]{};

if (args.length > 1) {
expArgs = Arrays.copyOfRange(args, 1, args.length);
}

ExpTest expTest = interpreter.getContext().getExpTest(args[0].toString());
if (expTest == null) {
throw new InterpretException("No exp test defined for name '" + args[0] + "'", interpreter.getLineNumber());
}
Expand All @@ -47,7 +55,7 @@ public Object filter(Object var, JinjavaInterpreter interpreter, String... args)
while (loop.hasNext()) {
Object val = loop.next();

if (expTest.evaluate(val, interpreter)) {
if (expTest.evaluate(val, interpreter, expArgs)) {
result.add(val);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,18 @@ public class SelectFilterTest {
@Before
public void setup() {
jinjava = new Jinjava();
jinjava.getGlobalContext().put("numbers", Lists.newArrayList(1, 2, 3, 4, 5));
jinjava.getGlobalContext().put("numbers", Lists.newArrayList(1L, 2L, 3L, 4L, 5L));
}

@Test
public void testSelect() {
assertThat(jinjava.render("{{numbers|select('odd')}}", new HashMap<String, Object>())).isEqualTo("[1, 3, 5]");
assertThat(jinjava.render("{{numbers|select('even')}}", new HashMap<String, Object>())).isEqualTo("[2, 4]");
assertThat(jinjava.render("{{numbers|select('odd')}}", new HashMap<>())).isEqualTo("[1, 3, 5]");
assertThat(jinjava.render("{{numbers|select('even')}}", new HashMap<>())).isEqualTo("[2, 4]");
}

@Test
public void testSelectWithEqualToAttr() {
assertThat(jinjava.render("{{numbers|select('equalto', 3)}}", new HashMap<>())).isEqualTo("[3]");
}

}

0 comments on commit b4df68c

Please sign in to comment.