Skip to content

Commit 910ab53

Browse files
committed
feat: support Jackson 3.x
1 parent 656fb98 commit 910ab53

File tree

14 files changed

+183
-11
lines changed

14 files changed

+183
-11
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ See also the [CHANGELOG](https://github.com/cucumber/cucumber-jvm/blob/master/CH
1111

1212
### Added
1313

14+
- [Scala] Support for Jackson 3.x with `Jackson3DefaultDataTableEntryTransformer` trait
15+
- Jackson 2.x is still supported with `JacksonDefaultDataTableEntryTransformer` trait
16+
1417
### Changed
1518

1619
### Deprecated

build.sbt

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ scalaVersion := scala213
4242

4343
val cucumberVersion = "7.30.0"
4444
val jacksonVersion = "2.20.0"
45+
val jackson3Version = "3.0.0"
4546
val mockitoScalaVersion = "1.17.45"
4647
val junit4Version = "4.13.2"
4748

@@ -83,7 +84,8 @@ lazy val root = (project in file("."))
8384
.aggregate(
8485
cucumberScala.projectRefs ++
8586
integrationTestsCommon.projectRefs ++
86-
integrationTestsJackson.projectRefs ++
87+
integrationTestsJackson2.projectRefs ++
88+
integrationTestsJackson3.projectRefs ++
8789
integrationTestsPicoContainer.projectRefs ++
8890
examplesJunit4.projectRefs ++
8991
examplesJunit5.projectRefs: _*
@@ -99,6 +101,7 @@ lazy val cucumberScala = (projectMatrix in file("cucumber-scala"))
99101
"io.cucumber" % "cucumber-core" % cucumberVersion,
100102
// Users have to provide it (for JacksonDefaultDataTableTransformer)
101103
"com.fasterxml.jackson.module" %% "jackson-module-scala" % jacksonVersion % Provided,
104+
"tools.jackson.module" %% "jackson-module-scala" % jackson3Version % Provided,
102105
"org.junit.jupiter" % "junit-jupiter" % junitBom.key.value % Test,
103106
("org.mockito" %% "mockito-scala" % mockitoScalaVersion % Test)
104107
.cross(CrossVersion.for3Use2_13)
@@ -158,12 +161,12 @@ lazy val integrationTestsCommon =
158161
.dependsOn(cucumberScala % Test)
159162
.jvmPlatform(scalaVersions = Seq(scala3, scala213, scala212))
160163

161-
lazy val integrationTestsJackson =
162-
(projectMatrix in file("integration-tests/jackson"))
164+
lazy val integrationTestsJackson2 =
165+
(projectMatrix in file("integration-tests/jackson2"))
163166
.settings(commonSettings)
164167
.settings(junit5SbtSupport)
165168
.settings(
166-
name := "integration-tests-jackson",
169+
name := "integration-tests-jackson2",
167170
libraryDependencies ++= Seq(
168171
"org.junit.platform" % "junit-platform-suite" % junitBom.key.value % Test,
169172
"io.cucumber" % "cucumber-junit-platform-engine" % cucumberVersion % Test,
@@ -174,6 +177,22 @@ lazy val integrationTestsJackson =
174177
.dependsOn(cucumberScala % Test)
175178
.jvmPlatform(scalaVersions = Seq(scala3, scala213, scala212))
176179

180+
lazy val integrationTestsJackson3 =
181+
(projectMatrix in file("integration-tests/jackson3"))
182+
.settings(commonSettings)
183+
.settings(junit5SbtSupport)
184+
.settings(
185+
name := "integration-tests-jackson3",
186+
libraryDependencies ++= Seq(
187+
"org.junit.platform" % "junit-platform-suite" % junitBom.key.value % Test,
188+
"io.cucumber" % "cucumber-junit-platform-engine" % cucumberVersion % Test,
189+
"tools.jackson.module" %% "jackson-module-scala" % jackson3Version % Test
190+
),
191+
publishArtifact := false
192+
)
193+
.dependsOn(cucumberScala % Test)
194+
.jvmPlatform(scalaVersions = Seq(scala3, scala213, scala212))
195+
177196
lazy val integrationTestsPicoContainer =
178197
(projectMatrix in file("integration-tests/picocontainer"))
179198
.settings(commonSettings)
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.cucumber.scala
2+
3+
import tools.jackson.databind.ObjectMapper
4+
import tools.jackson.databind.json.JsonMapper
5+
import tools.jackson.module.scala.ScalaModule
6+
7+
/** <p>This trait register a `DefaultDataTableEntryTransformer` using Jackson
8+
* `ObjectMapper`. </p>
9+
*
10+
* <p>The `[empty]` string is used as default empty string replacement. You can
11+
* override it if you need to.</p>
12+
*
13+
* <p>Note: Jackson is not included with Cucumber Scala, you have to add the
14+
* dependency: `tools.jackson.module:jackson-module-scala` to your project if
15+
* you want to use this trait.</p>
16+
*
17+
* <p>For Jackson 2.x, use `JacksonDefaultDataTableEntryTransformer`
18+
* instead.</p>
19+
*/
20+
trait Jackson3DefaultDataTableEntryTransformer extends ScalaDsl {
21+
22+
/** Define the string to be used as replacement for empty. Default is
23+
* `[empty]`.
24+
*/
25+
def emptyStringReplacement: String = "[empty]"
26+
27+
/** Create the Jackson ObjectMapper to be used. Default is a simple JsonMapper
28+
* with ScalaModule (including all builtin modules) registered.
29+
*/
30+
def createObjectMapper(): ObjectMapper = {
31+
val scalaModule = ScalaModule
32+
.builder()
33+
.addAllBuiltinModules()
34+
.build()
35+
JsonMapper.builder().addModule(scalaModule).build()
36+
}
37+
38+
private lazy val objectMapper: ObjectMapper = createObjectMapper()
39+
40+
DefaultDataTableEntryTransformer(emptyStringReplacement) {
41+
(fromValue: Map[String, String], toValueType: java.lang.reflect.Type) =>
42+
objectMapper.convertValue[AnyRef](
43+
fromValue,
44+
objectMapper.constructType(toValueType)
45+
)
46+
}
47+
48+
}

cucumber-scala/src/main/scala/io/cucumber/scala/JacksonDefaultDataTableEntryTransformer.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ import com.fasterxml.jackson.module.scala.DefaultScalaModule
1010
* override it if you need to.</p>
1111
*
1212
* <p>Note: Jackson is not included with Cucumber Scala, you have to add the
13-
* dependency: `com.fasterxml.jackson.module:jackson-module-scala_2.xx` to your
13+
* dependency: `com.fasterxml.jackson.module:jackson-module-scala` to your
1414
* project if you want to use this trait.</p>
15+
*
16+
* <p>For Jackson 3.x, use `Jackson3DefaultDataTableEntryTransformer`
17+
* instead.</p>
1518
*/
1619
trait JacksonDefaultDataTableEntryTransformer extends ScalaDsl {
1720

docs/build.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ The project contains several subprojects:
1212
- `cucumber-scala`: contains the codebase of the Cucumber Scala implementation
1313
- `integration-tests`: contains integration tests projects
1414
- `common`: general integration tests
15-
- `jackson`: Jackson integration specific tests
15+
- `jackson2`: Jackson 2.x integration specific tests
16+
- `jackson3`: Jackson 3.x integration specific tests
1617
- `picocontainer`: Picocontainer integration specific tests
1718
- `examples`: contains a sample project
1819

docs/default_jackson_datatable_transformer.md

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,54 @@ It can be used to automatically convert DataTables to case classes without defin
66

77
## Add Jackson dependency
88

9+
### Jackson 2.x
10+
911
To use this optional transformer, you need to have Jackson Scala in your dependencies.
1012

1113
```xml
1214
<dependency>
1315
<groupId>com.fasterxml.jackson.module</groupId>
1416
<artifactId>jackson-module-scala_2.13</artifactId>
15-
<version>2.13.3</version>
17+
<version>2.20.0</version>
1618
<scope>test</scope>
1719
</dependency>
1820
```
1921

2022
Or:
2123
```sbt
22-
libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.13.3" % Test
24+
libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.20.0" % Test
2325
```
2426

25-
2627
The current version of Cucumber Scala has been tested against Jackson Module Scala **version 2.20.0**.
2728

29+
### Jackson 3.x
30+
31+
To use this optional transformer, you need to have Jackson Scala in your dependencies.
32+
33+
```xml
34+
<dependency>
35+
<groupId>tools.jackson.module</groupId>
36+
<artifactId>jackson-module-scala_2.13</artifactId>
37+
<version>3.0.0</version>
38+
<scope>test</scope>
39+
</dependency>
40+
```
41+
42+
Or:
43+
```sbt
44+
libraryDependencies += "tools.jackson.module" %% "jackson-module-scala" % "3.0.0" % Test
45+
```
46+
47+
The current version of Cucumber Scala has been tested against Jackson Module Scala **version 3.0.0**.
48+
2849
## Add the transformer
2950

30-
The transformer has to be added to your glue code by extending the `JacksonDefaultDataTableEntryTransformer` trait.
51+
The transformer has to be added to your glue code by extending the `JacksonDefaultDataTableEntryTransformer` (Jackson 2.x)
52+
or `Jackson3DefaultDataTableEntryTransformer` (Jackson 3.x) trait.
3153

3254
For instance:
3355
```scala
34-
class MySteps extends ScalaDsl with EN with JacksonDefaultDataTableEntryTransformer {
56+
class MySteps extends ScalaDsl with EN with Jackson3DefaultDataTableEntryTransformer {
3557
// Your usual glue code
3658
}
3759
```

0 commit comments

Comments
 (0)