Skip to content

Provide out-of-the-box support for mapping Datatables to Scala case classes #31

Closed
@gaeljw

Description

@gaeljw

I believe the Cucumber Scala should provide an easy way to map Datatables to case classes.

case class MyCaseClass(a: Int, b: String)

Given("expression") { (data:Datatable) =>
   val myData = data.asLists(classOf[MyCaseClass])
}

I'm not sure if this should be part of Cucumber Scala by default (if it's possible) or this has to be an optional feature that users can enable by inheriting a trait for instance. I guess it depends on how it's implemented 🤔

This was possible in with version 2.x and as far as I know, for now, it has to be implemented with custom transformers and/or type registry.

Example of implementation in Cucumber Scala 4.7:

trait TypeRegistry extends TypeRegistryConfigurer {

  override def locale(): Locale = Locale.ENGLISH

  override def configureTypeRegistry(typeRegistry: api.TypeRegistry): Unit = {
    val transformer = new DefaultTransformer()
    typeRegistry.setDefaultDataTableEntryTransformer(transformer)
    typeRegistry.setDefaultDataTableCellTransformer(transformer)
    typeRegistry.setDefaultParameterTransformer(transformer)
  }

}

class DefaultTransformer
  extends ParameterByTypeTransformer
    with TableEntryByTypeTransformer
    with TableCellByTypeTransformer {

  var objectMapper: ObjectMapper = new ObjectMapper()
  objectMapper.registerModule(DefaultScalaModule)

  override def transform(s: String, `type`: Type): AnyRef = {
    objectMapper.convertValue(s, objectMapper.constructType(`type`))
  }

  override def transform[T](entry: JMap[String, String], `type`: Class[T], cellTransformer: TableCellByTypeTransformer): T = {
    objectMapper.convertValue(entry, objectMapper.constructType(`type`))
  }

  override def transform[T](value: String, cellType: Class[T]): T = {
    objectMapper.convertValue(value, objectMapper.constructType(cellType))
  }

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions