Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- [Java] Add OSGi metadata
### Added
- [Java] class `KeyboardFriendlyDecimalFormatSymbols` is now `public` and can be used when creating a custom `Locale`-aware type transformation method ([#376](https://github.com/cucumber/cucumber-expressions/issues/376) [antagoony](https://github.com/antagoony))
- [Java] interface `LocaleParameterByTypeTransformer` to support `Locale`-aware type transformation ([#376](https://github.com/cucumber/cucumber-expressions/issues/376) [antagoony](https://github.com/antagoony))

### Removed
- [Python] Remove support for end-of-life Python 3.8 and 3.9 ([#359](https://github.com/cucumber/cucumber-expressions/pull/359))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import static java.util.Objects.requireNonNull;

final class BuiltInParameterTransformer implements ParameterByTypeTransformer {
final class BuiltInParameterTransformer implements LocaleParameterByTypeTransformer {

private final NumberParser numberParser;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,9 @@ public List<Argument<?>> match(String text, Type... typeHints) {
ParameterType<?> parameterType = parameterTypes.get(i);
Type type = i < typeHints.length ? typeHints[i] : String.class;
if (parameterType.isAnonymous()) {
ParameterByTypeTransformer defaultTransformer = parameterTypeRegistry.getDefaultParameterTransformer();
parameterTypes.set(i, parameterType.deAnonymize(type, arg -> defaultTransformer.transform(arg, type)));
LocaleParameterByTypeTransformer defaultTransformer = parameterTypeRegistry.getDefaultParameterTransformer();
parameterTypes.set(i, parameterType.deAnonymize(type, arg -> defaultTransformer.transform(arg, type,
parameterTypeRegistry.getLocale())));
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package io.cucumber.cucumberexpressions;

import java.lang.reflect.Type;
import java.util.Locale;
import org.apiguardian.api.API;

/**
* This extension of {@link ParameterByTypeTransformer} provides an additional
* transform method that consumes a {@link Locale locale}. Intentionally, this
* will be the locale information specified within the feature file containing
* the currently processed scenario.
*
* @see KeyboardFriendlyDecimalFormatSymbols
*/
@API(status = API.Status.EXPERIMENTAL)
@FunctionalInterface
public interface LocaleParameterByTypeTransformer extends ParameterByTypeTransformer {

/**
* Similar to {@link #transform(String, Type)} but, in addition, consumes a
* {@link Locale locale}. This locale information can be ignored, or can be
* considered in case the transformation is aware of localized values. For
* example, numbers {@linkplain KeyboardFriendlyDecimalFormatSymbols may use
* localized decimal symbols}.
*
* @implNote The default implementation ignores the {@code locale} and
* delegates to {@link #transform(String, Type)}
*/
default Object transform(final String fromValue, final Type toValueType, final Locale locale) throws Throwable {
return this.transform(fromValue, toValueType);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,16 @@ public final class ParameterTypeRegistry {
* To maintain consistency with `datatable` we don't use the mutable default
* transformer to handle build in in conversions yet.
*/
private final ParameterByTypeTransformer internalParameterTransformer;
private ParameterByTypeTransformer defaultParameterTransformer;
private final LocaleParameterByTypeTransformer internalParameterTransformer;
private LocaleParameterByTypeTransformer defaultParameterTransformer;
private Locale locale;

public ParameterTypeRegistry(Locale locale) {
this(new BuiltInParameterTransformer(locale), locale);
this.locale = locale;
}

private ParameterTypeRegistry(ParameterByTypeTransformer defaultParameterTransformer, Locale locale) {
private ParameterTypeRegistry(LocaleParameterByTypeTransformer defaultParameterTransformer, Locale locale) {
this.internalParameterTransformer = defaultParameterTransformer;
this.defaultParameterTransformer = defaultParameterTransformer;

Expand Down Expand Up @@ -161,11 +163,21 @@ public void defineParameterType(ParameterType<?> parameterType) {
}
}

ParameterByTypeTransformer getDefaultParameterTransformer() {
LocaleParameterByTypeTransformer getDefaultParameterTransformer() {
return defaultParameterTransformer;
}

public void setDefaultParameterTransformer(ParameterByTypeTransformer defaultParameterTransformer) {
final LocaleParameterByTypeTransformer localeParameterTransformer;
if (defaultParameterTransformer instanceof LocaleParameterByTypeTransformer) {
localeParameterTransformer = (LocaleParameterByTypeTransformer) defaultParameterTransformer;
} else {
localeParameterTransformer = defaultParameterTransformer::transform;
}
setDefaultParameterTransformer(localeParameterTransformer);
}

public void setDefaultParameterTransformer(LocaleParameterByTypeTransformer defaultParameterTransformer) {
this.defaultParameterTransformer = defaultParameterTransformer;
}

Expand All @@ -186,6 +198,10 @@ <T> ParameterType<T> lookupByRegexp(String parameterTypeRegexp, Pattern expressi
return (ParameterType<T>) parameterTypes.first();
}

Locale getLocale() {
return locale;
}

Collection<ParameterType<?>> getParameterTypes() {
return parameterTypeByName.values();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public List<Argument<?>> match(String text, Type... typeHints) {
return null;
}

final ParameterByTypeTransformer defaultTransformer = parameterTypeRegistry.getDefaultParameterTransformer();
final LocaleParameterByTypeTransformer defaultTransformer = parameterTypeRegistry.getDefaultParameterTransformer();
final List<ParameterType<?>> parameterTypes = new ArrayList<>();
int typeHintIndex = 0;
for (GroupBuilder groupBuilder : treeRegexp.getGroupBuilder().getChildren()) {
Expand All @@ -63,7 +63,8 @@ public List<Argument<?>> match(String text, Type... typeHints) {

// Either from createAnonymousParameterType or lookupByRegexp
if (parameterType.isAnonymous()) {
parameterType = parameterType.deAnonymize(typeHint, arg -> defaultTransformer.transform(arg, typeHint));
parameterType = parameterType.deAnonymize(typeHint, arg -> defaultTransformer.transform(arg, typeHint,
parameterTypeRegistry.getLocale()));
}

parameterTypes.add(parameterType);
Expand Down