All Versions
Latest Version
Avg Release Cycle
63 days
Latest Release
2211 days ago

Changelog History
Page 1

  • v0.27.0 Changes

    July 01, 2018

    โœ… [0.27.0] - 2018.07.01 - Replace Custom Test Data Generation with ScalaCheck Shapeless

    This is the first baby step in replacing custom reflection-based code with

    • 2017.10.26 - longevity.model.PType[M, P] now has an abstract member with type
      longevity.model.PEv[M, P]. This is filled in by the @longevity.model.annotations.persistent
      family of annotations, so it is not a concern to you if you are using these annotations to
      construct your PTypes. If not, you might consider using the new
      @longevity.model.annotations.pEv annotation to create the PEv for you.
    • 2017.10.26 - Traits for polymorphic persistent and component types - typically declared via
      annotations @longevity.model.annotations.polyPersistent and
      @longevity.model.annotations.polyComponent - now need to be sealed. This will require moving
      subtypes into the same file.
    • โœ… 2017.10.26 - The longevity.test.TestDataGenerator API has been simplified. If you were using
      this class in a way for which the new version is no longer sufficient, please let us know, and we
      ๐Ÿ‘€ will see what we can do to help you out.
    • โœ… 2018.06.07 - Classes longevity.test.CustomGenerator and longevity.test.CustomGeneratorPool
      ๐Ÿšš have been removed. Custom test generation to account for constraints enforced within your domain
      model can now be accomplished using ScalaCheck's Arbitrary and
      ๐Ÿ‘€ Gen, See the user manual page on enforcing
      โœ… constraints
      for more information.
  • v0.26.0 Changes

    October 25, 2017

    ๐Ÿ‘€ Please see the user manual for an explanation of this new feature.

  • v0.25.1 Changes

    August 30, 2017
  • v0.25.0 Changes

    July 24, 2017
    • 2016.07.12 - Add some specialized "implicit not found" error messages for implicit types in
    • 2016.07.12 - Reverse order of implicits for Repo.retrieve and Repo.retrieveOne methods. This
      way, we get "implicit not found" compiler errors for the PEv before the Key. This will give
      more relevant error messages when the retrieve methods are called without explicating the P type
    • 2016.07.12 - Rename to PState.modify. This follows more standard lense-type
      ๐Ÿšš terminology, and removes the incorrect impression that this is a monadic method.
    • 2016.07.24 - Add PState.modifyF, which acts like modify, except for functions that return an
      effectful result.
  • v0.24.0 Changes

    July 06, 2017
    • 2017.06.14 - Rename config flag autocreateSchema to autoCreateSchema.
    • 2017.06.14 - Add config flag autoOpenConnection.
    • 2017.06.15 - Add API method Repo.openConnection.
    • 2017.06.15 - Rename API method Repo.closeConnection to Repo.closeConnection.
    • 2017.06.16 - Add config flag cassandra.autoCreateKeyspace.
    • 2017.06.19 - Rename longevity.config.LongevityConfig.apply(com.typesafe.config.Config) to LongevityConfig.fromTypesafeConfig. This was necessary to prevent the library we use to parse the Typesafe config from infinite looping on a configuration error.
    • ๐Ÿšš 2017.06.29 - Remove longevity.persistent.FOPState and variants. Now that we have generalized effects, these classes are special case. And they already take up a lot of space in API.
    • ๐Ÿšš 2017.06.29 - Remove method longevity.persistent.Repo.createMany and related longevity.persistent.PWithEv. These provided very little value added at the expense of cluttering the API with confusing stuff.
    • 2017.07.06 - Replace hardcoded Future effect with generic effect F in longevity.context.LongevityContext and longevity.persistence.Repo.
  • v0.23.0 Changes

    June 09, 2017

    ๐Ÿš€ The changes in this release are many, and the overall picture is hard to grasp by looking through a bullet list of the changes. For this reason, we present a quick migration guide here to get you from 0.22 to 0.23. Making the changes in the migration guide will probably get you 95-100% of the way there.

    Quick Migration Guide

    1. Replace this:

    @domainModel object MyModel

    with this:

    @domainModel trait MyModel

    1. Replace @persistent with @persistent[MyModel], @component with @component[MyModel], and @keyVal[P] with @keyVal[MyModel, P] ๐Ÿšš 1. Remove the keySet = Set(key(props.a), key(props.b)) as an argument to the @persistent annotation. Put the following lines in the companion object for your persistent class instead:

    implicit val aKey = key(props.a) implicit val bKey = key(props.b)

    1. Replace this:

    val context = LongevityContext(MyModel)

    with this:

    val context = LongevityContext[MyModel]()

    1. Replace references to Repo[P] with Repo[MyModel]
    2. Replace calls like this:


    with this:


    1. For repository methods createSchema and closeConnection, replace calls like this:


    with call chains like this:


    ๐Ÿ”„ Changes

    • ๐Ÿ”€ Merge longevity.persistence.Repo and longevity.persistence.RepoPool APIs. There is now a single repository, and the create/retrieve/update/delete/query methods now all take the persistent type as a type parameter. To migrate, code that used to look like this:


    now looks like this:


    In most cases, you can leave off type parameter, as the compiler can easily infer it:


    • Replace longevity.model.DomainModel with a longevity.model.ModelType type-class. Everything that used to live in DomainModel now lives in ModelType. longevity.model.annotations.domainModel now annotates a marker class or trait, instead of the object that was to become the old DomainModel. This annotation macro adds an implicit object modelType into the companion object of the annotated class. ModelType now takes a type parameter M that refers to the phantom class annotated with domainModel.

    longevity.context.LongevityContext now takes a type parameter M for the model class. In place of the explicit DomainModel argument, it now takes an implicit ModelType[M], which can easily be found in the companion object of M, as built by the annotation macro. longevity.context.Repo also now takes a type parameter M.

    • โž• Add longevity.model.ModelEv type-class. ("Ev" is short for "evidence" here.) The longevity.model.annotations.domainModel annotation macro now adds an implicit object modelEv into the companion object of the annotated class. This evidence class is private to the package that the domain model is found in. longevity.model.PType now has a type parameter M for the model, and an implicit ModelEv[M] is required to initialize a PType[M, P]. Because the generated model evidence is private to the model package, persistent types outside of the model package will not find the evidence, and will fail to compile. This prevents the user from accidentally creating a persistent type that falls outside the model.

    • โž• Add longevity.model.PEv type-class. ("Ev" is short for "evidence" here.) The longevity.model.PType now includes an implicit val ev: PEv[M, P]. Because the companion object of a persistent class is normally the corresponding PType, this evidence should be available where needed. longevity.persistence.Repo methods that used to take an implicit TypeKey[P] argument, now take an implicit PEv[M, P] argument. As users will not be able to find an implicit PEv[M, P] available without the type P actually being part of the model, (excepting the case where the user goes to extended lengths to subvert our type system), it will now be a compile-time error to call these repository methods with a non-persistent object. This is a great improvement over the old situation, since a TypeKey[P] is available for any type P for which there is a TypeTag[P] available.

    • Replace longevity.model.KeyVal[P] with longevity.model.KVType[M, P, V], which includes an implicit val longevity.model.KVEv[M, P, V]. @longevity.model.annotations.keyVal now takes a type parameter M along with the type parameter P. The @keyVal annotation now creates or augments the companion object as a KVType[M, P, V].

    • Methods PType.key and PType.primaryKey now take implicit KVEv arguments, to make sure the key value type provided matches a KVType that is provided to the ModelType.

    • The old constructors and factory methods for creating a longevity.model.ModelType have been replaced with a single constructor that takes lists of longevity.model.PTypes, longevity.model.CTypes, and longevity.model.KVTypes. The runtime package scanning constructor has been replaced by a compile-time package scanning. The new scanner, longevity.model.annotations.packscanToList, is used by longevity.model.annotations.domainModel, but you can use it yourself if you like. If you have been using the @domainModel annotation, these changes should not affect you.

    • ๐Ÿšš longevity.model.PTypePool and longevity.model.CTypePool have been removed.

    • Instead of passing in a keySet to the @persistent annotation, users should now specify their keys themselves, directly in the body of the companion object, as implicit values. The PType.keySet has been made private, and is populated by reflecting on the members of the companion object.

    • Methods longevity.persistence.Repo.retrieve and longevity.persistence.Repo.retrieveOne now take an implicit Key[M, P, V] instead of an implicit TypeKey[V]. This will typically be found by implicit resolution in the companion object of P.

    • โœ‚ Remove method longevity.model.PType.prop. You can extend longevity.model.ptype.Prop instead, but note that we advise you to use the longevity.model.annotations.persistent annotation to generate properties.

  • v0.22.0 Changes

    March 25, 2017

    [0.22.0] - 2017.03.25 - Stream Queries to Multiple Streaming Libraries

    • 2017.03.24 - Rename Repo.retrieveByQuery to Repo.queryToFutureVec. The return type of this
      method has also been adjusted from Future[Seq[PState[P]]] to Future[Vector[PState[P]]].
    • 2017.03.24 - Add method Repo.queryToItereator.
    • 2017.03.24 - Rename Repo.streamByQuery to Repo.queryToAkkaStream.
    • 2017.03.24 - Add method Repo.queryToFS2.
    • 2017.03.24 - Add method Repo.queryToIterateeIo.
    • 2017.03.24 - Add method Repo.queryToPlay.
  • v0.21.0 Changes

    March 04, 2017

    [0.21.0] - 2017.03.04 - JDBC Back End and Timestamps

    • 2017.02.08 - Add new JDBC back end.
    • 2017.02.06 - Rename longevity.config.SQLiteConfig to
      JdbcConfig. Rename longevity.config.LongevityConfig.sqlite to
      โœ… jdbc. Rename longevity.config.TestConfig.sqlite to jdbc.
    • ๐Ÿ”ง 2017.02.15 - Add configuration flag longevity.writeTimestamps.
  • v0.20.0 Changes

    January 16, 2017

    [0.20.0] - 2017.01.16 - SQLite Back End

    • 2017.01.12 - Rename dependency bundle artifact from
      longevity-mongo-deps to longevity-mongodb-deps.
    • 2017.01.12 - Rename longevity.config.Mongo to
      longevity.config.MongoDB. Rename longevity.config.MongoConfig to
    • ๐Ÿ‘€ 2017.01.14 - Add SQLite back end. See longevity.config.SQLite and
    • 2017.01.14 - Rename longevity.model.PType.partitionKey to
  • v0.19.0 Changes

    December 10, 2016

    [0.19.0] - 2016.12.09 - Rename Subdomain to Domain Model

    • ๐Ÿ“ฆ 2016.12.09 - Rename package longevity.subdomain to
      longevity.model. Also longevity.exceptions.subdomain to
    • 2016.12.09 - Rename longevity.model.Subdomain to
    • 2016.12.09 - Rename annotation
      longevity.model.annotations.subdomain to domainModel.
    • ๐Ÿšš 2016.12.09 - Move config classes LongevityConfig, BackEnd,
      โœ… MongoConfig, CassandraConfig, TestConfig, and
      ๐Ÿ“ฆ PersistenceConfig from package longevity.context to new package