Skip to content

Commit f7afcdf

Browse files
Merge 9c26c05 into dde1d4c
2 parents dde1d4c + 9c26c05 commit f7afcdf

33 files changed

+408
-3
lines changed

.revapi/api-changes.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@
4343
"old": "interface io.cucumber.messages.internal.com.google.protobuf.MutabilityOracle",
4444
"new": "interface io.cucumber.messages.internal.com.google.protobuf.MutabilityOracle",
4545
"justification": "Internal API"
46+
},
47+
{
48+
"code": "java.method.addedToInterface",
49+
"new": "method java.lang.Class<? extends java.util.function.Predicate<io.cucumber.core.gherkin.Pickle>> io.cucumber.core.filter.Options::getCustomPredicateClass()",
50+
"justification": "New configuration"
51+
},
52+
{
53+
"code": "java.method.addedToInterface",
54+
"new": "method java.lang.Class<? extends java.util.function.Predicate<io.cucumber.core.gherkin.Pickle>> io.cucumber.core.options.CucumberOptionsAnnotationParser.CucumberOptions::customPredicateClass()",
55+
"justification": "New configuration"
4656
}
4757
]
4858
}

core/src/main/java/io/cucumber/core/cli/CommandlineOptions.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public final class CommandlineOptions {
3535
public static final String TAGS = "--tags";
3636
public static final String TAGS_SHORT = "-t";
3737

38+
public static final String CUSTOM_PREDICATE_CLASS = "--custompredicateclass";
39+
public static final String CUSTOM_PREDICATE_CLASS_SHORT = "-cpc";
40+
3841
public static final String PUBLISH = "--publish";
3942

4043
public static final String PLUGIN = "--plugin";

core/src/main/java/io/cucumber/core/filter/Filters.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.cucumber.core.gherkin.Pickle;
44
import io.cucumber.tagexpressions.Expression;
55

6+
import java.lang.reflect.InvocationTargetException;
67
import java.net.URI;
78
import java.util.Collection;
89
import java.util.List;
@@ -27,6 +28,18 @@ public Filters(Options options) {
2728
if (!lineFilters.isEmpty()) {
2829
this.filter = this.filter.and(new LinePredicate(lineFilters));
2930
}
31+
Class<? extends Predicate<Pickle>> customPicklePredicateClass = options.getCustomPredicateClass();
32+
if (customPicklePredicateClass != null) {
33+
Predicate<Pickle> customPicklePredicate;
34+
try {
35+
customPicklePredicate = customPicklePredicateClass.getConstructor().newInstance();
36+
} catch (InstantiationException | IllegalAccessException | InvocationTargetException
37+
| NoSuchMethodException e) {
38+
throw new IllegalArgumentException(
39+
"The customPredicateClass does not have a public default constructor", e);
40+
}
41+
this.filter = this.filter.and(customPicklePredicate);
42+
}
3043
}
3144

3245
@Override

core/src/main/java/io/cucumber/core/filter/Options.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package io.cucumber.core.filter;
22

3+
import io.cucumber.core.gherkin.Pickle;
34
import io.cucumber.tagexpressions.Expression;
45

56
import java.net.URI;
67
import java.util.List;
78
import java.util.Map;
89
import java.util.Set;
10+
import java.util.function.Predicate;
911
import java.util.regex.Pattern;
1012

1113
public interface Options {
@@ -16,6 +18,8 @@ public interface Options {
1618

1719
Map<URI, Set<Integer>> getLineFilters();
1820

21+
Class<? extends Predicate<Pickle>> getCustomPredicateClass();
22+
1923
int getLimitCount();
2024

2125
}

core/src/main/java/io/cucumber/core/options/CommandlineOptionsParser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import java.util.stream.Collectors;
3030

3131
import static io.cucumber.core.cli.CommandlineOptions.COUNT;
32+
import static io.cucumber.core.cli.CommandlineOptions.CUSTOM_PREDICATE_CLASS;
33+
import static io.cucumber.core.cli.CommandlineOptions.CUSTOM_PREDICATE_CLASS_SHORT;
3234
import static io.cucumber.core.cli.CommandlineOptions.DRY_RUN;
3335
import static io.cucumber.core.cli.CommandlineOptions.DRY_RUN_SHORT;
3436
import static io.cucumber.core.cli.CommandlineOptions.GLUE;
@@ -60,6 +62,7 @@
6062
import static io.cucumber.core.cli.CommandlineOptions.WIP_SHORT;
6163
import static io.cucumber.core.options.ObjectFactoryParser.parseObjectFactory;
6264
import static io.cucumber.core.options.OptionsFileParser.parseFeatureWithLinesFile;
65+
import static io.cucumber.core.options.PicklePredicateParser.parsePicklePredicateClass;
6366
import static java.nio.charset.StandardCharsets.UTF_8;
6467
import static java.util.Arrays.asList;
6568
import static java.util.stream.Collectors.joining;
@@ -121,6 +124,8 @@ private RuntimeOptionsBuilder parse(List<String> args) {
121124
parsedOptions.addGlue(parse);
122125
} else if (arg.equals(TAGS) || arg.equals(TAGS_SHORT)) {
123126
parsedOptions.addTagFilter(TagExpressionParser.parse(removeArgFor(arg, args)));
127+
} else if (arg.equals(CUSTOM_PREDICATE_CLASS) || arg.equals(CUSTOM_PREDICATE_CLASS_SHORT)) {
128+
parsedOptions.setCustomPredicateClass(parsePicklePredicateClass(removeArgFor(arg, args)));
124129
} else if (arg.equals(PUBLISH)) {
125130
parsedOptions.setPublish(true);
126131
} else if (arg.equals(PLUGIN) || arg.equals(PLUGIN_SHORT)) {

core/src/main/java/io/cucumber/core/options/Constants.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ public final class Constants {
8888
*/
8989
public static final String FEATURES_PROPERTY_NAME = "cucumber.features";
9090

91+
/**
92+
* Property name used to set custom predicate class: {@value}
93+
* <p>
94+
* The fully qualified class name of the custom predicate
95+
*/
96+
public static final String CUSTOM_PREDICATE_CLASS_PROPERTY_NAME = "cucumber.custompredicateclass";
97+
9198
/**
9299
* Property name used to set name filter: {@value}
93100
* <p>

core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import io.cucumber.core.exception.CucumberException;
55
import io.cucumber.core.feature.FeatureWithLines;
66
import io.cucumber.core.feature.GluePath;
7+
import io.cucumber.core.gherkin.Pickle;
78
import io.cucumber.core.snippets.SnippetType;
89
import io.cucumber.tagexpressions.TagExpressionException;
910
import io.cucumber.tagexpressions.TagExpressionParser;
1011

1112
import java.nio.file.Path;
1213
import java.nio.file.Paths;
14+
import java.util.function.Predicate;
1315
import java.util.regex.Pattern;
1416

1517
import static io.cucumber.core.options.OptionsFileParser.parseFeatureWithLinesFile;
@@ -38,6 +40,7 @@ public RuntimeOptionsBuilder parse(Class<?> clazz) {
3840
addDryRun(options, args);
3941
addMonochrome(options, args);
4042
addTags(classWithOptions, options, args);
43+
addCustomPredicate(options, args);
4144
addPlugins(options, args);
4245
addPublish(options, args);
4346
addStrict(options, args);
@@ -82,6 +85,10 @@ private void addTags(Class<?> clazz, CucumberOptions options, RuntimeOptionsBuil
8285
}
8386
}
8487

88+
private void addCustomPredicate(CucumberOptions options, RuntimeOptionsBuilder args) {
89+
args.setCustomPredicateClass(options.customPredicateClass());
90+
}
91+
8592
private void addPlugins(CucumberOptions options, RuntimeOptionsBuilder args) {
8693
for (String plugin : options.plugin()) {
8794
args.addPluginName(plugin);
@@ -206,6 +213,8 @@ public interface CucumberOptions {
206213

207214
String tags();
208215

216+
Class<? extends Predicate<Pickle>> customPredicateClass();
217+
209218
String[] plugin();
210219

211220
boolean publish();

core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.stream.Stream;
1717

1818
import static io.cucumber.core.options.Constants.ANSI_COLORS_DISABLED_PROPERTY_NAME;
19+
import static io.cucumber.core.options.Constants.CUSTOM_PREDICATE_CLASS_PROPERTY_NAME;
1920
import static io.cucumber.core.options.Constants.EXECUTION_DRY_RUN_PROPERTY_NAME;
2021
import static io.cucumber.core.options.Constants.EXECUTION_LIMIT_PROPERTY_NAME;
2122
import static io.cucumber.core.options.Constants.EXECUTION_ORDER_PROPERTY_NAME;
@@ -70,6 +71,11 @@ public RuntimeOptionsBuilder parse(Map<String, String> properties) {
7071
splitAndThenFlatMap(CucumberPropertiesParser::parseFeatureFile),
7172
builder::addFeature);
7273

74+
parse(properties,
75+
CUSTOM_PREDICATE_CLASS_PROPERTY_NAME,
76+
PicklePredicateParser::parsePicklePredicateClass,
77+
builder::setCustomPredicateClass);
78+
7379
parseAll(properties,
7480
FEATURES_PROPERTY_NAME,
7581
splitAndThenFlatMap(CucumberPropertiesParser::parseRerunFile),
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.cucumber.core.options;
2+
3+
import io.cucumber.core.gherkin.Pickle;
4+
5+
import java.util.function.Predicate;
6+
7+
public final class PicklePredicateParser {
8+
9+
@SuppressWarnings("unchecked")
10+
public static Class<? extends Predicate<Pickle>> parsePicklePredicateClass(String predicateClassName) {
11+
Class<?> clazz;
12+
try {
13+
clazz = Class.forName(predicateClassName);
14+
} catch (ClassNotFoundException | ClassCastException e) {
15+
throw new IllegalArgumentException(
16+
String.format("Could not load predicate class for '%s'", predicateClassName), e);
17+
}
18+
if (!Predicate.class.isAssignableFrom(clazz)) {
19+
throw new IllegalArgumentException(String.format("Predicate class '%s' was not a subclass of '%s'",
20+
clazz, Predicate.class));
21+
}
22+
return (Class<? extends Predicate<Pickle>>) clazz;
23+
}
24+
25+
}

core/src/main/java/io/cucumber/core/options/RuntimeOptions.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.cucumber.core.backend.ObjectFactory;
44
import io.cucumber.core.feature.FeatureWithLines;
5+
import io.cucumber.core.gherkin.Pickle;
56
import io.cucumber.core.order.PickleOrder;
67
import io.cucumber.core.order.StandardPickleOrders;
78
import io.cucumber.core.plugin.NoPublishFormatter;
@@ -18,6 +19,7 @@
1819
import java.util.Set;
1920
import java.util.SortedSet;
2021
import java.util.TreeSet;
22+
import java.util.function.Predicate;
2123
import java.util.regex.Pattern;
2224
import java.util.stream.Collectors;
2325

@@ -40,6 +42,7 @@ public final class RuntimeOptions implements
4042
private final List<FeatureWithLines> featurePaths = new ArrayList<>();
4143
private final Set<Plugin> formatters = new LinkedHashSet<>();
4244
private final Set<Plugin> summaryPrinters = new LinkedHashSet<>();
45+
private Class<? extends Predicate<Pickle>> customPredicateClass = null;
4346
private boolean dryRun;
4447
private boolean monochrome = false;
4548
private boolean wip = false;
@@ -198,6 +201,10 @@ void setFeaturePaths(List<FeatureWithLines> featurePaths) {
198201
this.featurePaths.addAll(featurePaths);
199202
}
200203

204+
void setCustomPredicateClass(Class<? extends Predicate<Pickle>> customPredicateClass) {
205+
this.customPredicateClass = customPredicateClass;
206+
}
207+
201208
@Override
202209
public List<Expression> getTagExpressions() {
203210
return unmodifiableList(tagExpressions);
@@ -228,6 +235,11 @@ public Map<URI, Set<Integer>> getLineFilters() {
228235
return unmodifiableMap(lineFilters);
229236
}
230237

238+
@Override
239+
public Class<? extends Predicate<Pickle>> getCustomPredicateClass() {
240+
return customPredicateClass;
241+
}
242+
231243
@Override
232244
public int getLimitCount() {
233245
return getCount();

0 commit comments

Comments
 (0)