Package

com.gu

scanamo

Permalink

package scanamo

Linear Supertypes
AnyRef, Any
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. scanamo
  2. AnyRef
  3. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Type Members

  1. trait DerivedDynamoFormat extends AnyRef

    Permalink
  2. trait DynamoFormat[T] extends Serializable

    Permalink

    Type class for defining serialisation to and from DynamoDB's AttributeValue

    Type class for defining serialisation to and from DynamoDB's AttributeValue

    >>> val listOptionFormat = DynamoFormat[List[Option[Int]]]
    >>> listOptionFormat.read(listOptionFormat.write(List(Some(1), None, Some(3))))
    Right(List(Some(1), None, Some(3)))

    Also supports automatic derivation for case classes

    >>> case class Farm(animals: List[String])
    >>> case class Farmer(name: String, age: Long, farm: Farm)
    >>> val farmerF = DynamoFormat[Farmer]
    >>> farmerF.read(farmerF.write(Farmer("McDonald", 156L, Farm(List("sheep", "cow")))))
    Right(Farmer(McDonald,156,Farm(List(sheep, cow))))

    and for sealed trait + case object hierarchies

    >>> sealed trait Animal
    >>> case object Aardvark extends Animal
    >>> case object Zebra extends Animal
    >>> case class Pet(name: String, animal: Animal)
    >>> val petF = DynamoFormat[Pet]
    >>> petF.read(petF.write(Pet("Amy", Aardvark)))
    Right(Pet(Amy,Aardvark))
    
    >>> petF.read(petF.write(Pet("Zebediah", Zebra)))
    Right(Pet(Zebediah,Zebra))

    Problems reading a value are detailed

    >>> import cats.syntax.either._
    
    >>> case class Developer(name: String, age: String, problems: Int)
    >>> val invalid = DynamoFormat[Farmer].read(DynamoFormat[Developer].write(Developer("Alice", "none of your business", 99)))
    >>> invalid
    Left(InvalidPropertiesError(NonEmptyList(PropertyReadError(age,NoPropertyOfType(N,{S: none of your business,})), PropertyReadError(farm,MissingProperty))))
    
    >>> invalid.leftMap(cats.Show[error.DynamoReadError].show)
    Left('age': not of type: 'N' was '{S: none of your business,}', 'farm': missing)

    Optional properties are defaulted to None

    >>> case class LargelyOptional(a: Option[String], b: Option[String])
    >>> DynamoFormat[LargelyOptional].read(DynamoFormat[Map[String, String]].write(Map("b" -> "X")))
    Right(LargelyOptional(None,Some(X)))

    Custom formats can often be most easily defined using DynamoFormat.coercedXmap, DynamoFormat.xmap or DynamoFormat.iso

  3. trait EnumDynamoFormat extends DerivedDynamoFormat

    Permalink

    prop> sealed trait Animal
    prop> case object Aardvark extends Animal
    prop> case object Hippopotamus extends Animal
    prop> case object Zebra extends Animal
    
    prop> import org.scalacheck._
    prop> implicit val arbitraryAnimal: Arbitrary[Animal] = Arbitrary(Gen.oneOf(List(Aardvark, Hippopotamus, Zebra)))
    
    prop> (a: Animal) =>
        | DynamoFormat[Animal].read(DynamoFormat[Animal].write(a)) == Right(a)
    >>> DynamoFormat[Animal].write(Zebra).getS
    Zebra
  4. abstract class EnumerationDynamoFormat[T] extends DynamoFormat[T]

    Permalink
  5. case class Table[V](name: String)(implicit evidence$1: DynamoFormat[V]) extends Product with Serializable

    Permalink

    Represents a DynamoDB table that operations can be performed against

    Represents a DynamoDB table that operations can be performed against

    >>> case class Transport(mode: String, line: String)
    >>> val transport = Table[Transport]("transport")
    
    >>> val client = LocalDynamoDB.client()
    >>> import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType._
    
    >>> LocalDynamoDB.withTable(client)("transport")('mode -> S, 'line -> S) {
    ...   import com.gu.scanamo.syntax._
    ...   val operations = for {
    ...     _ <- transport.putAll(Set(
    ...       Transport("Underground", "Circle"),
    ...       Transport("Underground", "Metropolitan"),
    ...       Transport("Underground", "Central")))
    ...     results <- transport.query('mode -> "Underground" and ('line beginsWith "C"))
    ...   } yield results.toList
    ...   Scanamo.exec(client)(operations)
    ... }
    List(Right(Transport(Underground,Central)), Right(Transport(Underground,Circle)))

Value Members

  1. object DynamoFormat extends EnumDynamoFormat with Serializable

    Permalink
  2. object Scanamo

    Permalink

    Provides a simplified interface for reading and writing case classes to DynamoDB

    Provides a simplified interface for reading and writing case classes to DynamoDB

    To avoid blocking, use com.gu.scanamo.ScanamoAsync

  3. object ScanamoAsync

    Permalink

    Provides the same interface as com.gu.scanamo.Scanamo, except that it requires an implicit concurrent.ExecutionContext and returns a concurrent.Future

    Provides the same interface as com.gu.scanamo.Scanamo, except that it requires an implicit concurrent.ExecutionContext and returns a concurrent.Future

    Note that that com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient just uses an java.util.concurrent.ExecutorService to make calls asynchronously

  4. object ScanamoFree

    Permalink
  5. package error

    Permalink
  6. package ops

    Permalink
  7. package query

    Permalink
  8. package request

    Permalink
  9. object syntax

    Permalink
  10. package update

    Permalink

Inherited from AnyRef

Inherited from Any

Ungrouped