Skip to content

Releases: scalalandio/chimney

v1.7.1

30 Jan 13:18
Compare
Choose a tag to compare

Changelog:

  • bugfixes
    • increased test coverage for semiautomatic derivation methods and fixed a bug in Scala 3 implementation of TransformerDefinition.withFallbackFrom (#685)
    • enabling macro debugging for a single derivation (rather than globally) is no longer treated as an override changing behavior of some cases (#682)
    • fix some rename edge cases broken by 1.6.0 refactor (#683, fixed in #684)
  • updated documentation

v1.7.0

23 Jan 18:26
Compare
Choose a tag to compare

This big release bring some long-awaited features: transformations, which take more than 1 case class as input (well, not only case classes 😄 ) and improved Patchers which handle: recursive patching, overriding values.

Changelog:

With this release I feel that all of my personal ambitions for Chimney has been realized.

v1.6.0

31 Dec 14:07
Compare
Choose a tag to compare

Changelog:

  • now we are testing that macros in Scala 2.13 can read Scala 3 code and vice versa - while people might take it for granted, there are some differences in AST between both versions so support for e.g. default values or @BeanProperty requires additional work (done in #647)

  • withFieldComputed/withFieldComputedPartial can now be used in a version that does NOT take the whole input, and so removes the need for writing nested transformers (done in #650)

    // before
    foo.into[Bar]
      .withFieldComputed(_.baz, foo => f(foo.field)) // cannot just use f, does not work with .everyItem etc
      .transform
    
    // or
    implicit val inner: Transformer[Field, Baz] = ...
    
    foo.into[Bar]
     .withFieldComputed(_.baz, _.field.transformInto[Baz]) // actually never needed -> withFieldRenamed is enough
     .transform
    
    // now
    foo.into[Bar]
      .withFieldComputedFrom(_.field)(_.baz, f) // just f, can be used as ComputedFrom(_.everyItem)(_.everyItem, f) etc
      .transform
  • flags can be provided not only globally, but for nested scope as well, which further removed any need for nesting transformers (done in #653)

    // before
    foo.into[Bar]
      .withFieldComputed(_.baz, _.field.into[Baz].enableDefaultValues.transform)
      .transform
    
    // now
    foo.into[Bar]
      .withFieldRenamed(_.field, _.baz)
      .withTargetFlag(_.baz).enableDefaultValues
      .transform
  • make Path DSL more consistent - now Chimney should handle more overrides where we want to rewrite e.g. from _.everyItem._1 into _.everyMapKey, .matchingSome is consistent with .matching[Some[InferredA]].value, etc (done in #654)

  • for a long time when .withFieldConstPartial or .withFieldComputed(something that might throw) or .withFieldComputedPartial were used, the error Path contained the target field name - if such transformation happens in nesting you would receive an error path like sourceField.nestedSourceField.targetField which makes no sense. This is changed now, so that the Path would be <const for _.targetField>, <computed for _.targetField> or sourceField.anotherSourceField => <computed for _.targetField> to make it explicit that the failure didn't come from some value in input, but in a value provided explicitly, or returned from a function (done in #655 and #656)

  • documentation improvements by @ghostdogpr (#628) - thank you for your first contribution!

v1.5.0

08 Oct 16:21
Compare
Choose a tag to compare

Changelog:

v1.4.0

15 Aug 14:49
Compare
Choose a tag to compare

Changelog:

  • allow setting Chimney flags globally through -Xmacro-settings scalac flag - see the docs to be able to globally disable/enable default values, usage of defs, getters/setters, etc (done in #572)
  • start supporting some simple lens-like operations officially (added testing, bugfixed uncovered cases) - see the docs and start updating your data with value.into[ValueType].withFieldConst(_.fieldName.matching[Subtype].everyItem, value).transform and how it compares to e.g. Quicklens (done in #583)
  • improve the documentation about integrating other libraries with Chimney (done in #584)

v1.3.0

09 Jul 22:57
Compare
Choose a tag to compare

Changelog:

  • fix issue in Scala 2 related to (probably?) Symbol initialization AND default values in constructor not relying on companion apply (#562, fixed in #563)
  • improve support for singleton types - case objects and Scala 3 enums as target should always succeed and always be available as a fallback values for parameters (do not require matching input parameter) (#407, fixed in #559)
  • add Cats instances (Category/Invariant) for bi-directional transformations (Codec/Iso) (#566)
  • improve docs testing - test whether the Scala CLI output printed with pprint matches the expectation (#536, fixed in #567)
  • improve Protobufs support for data types modeled using sealed traits:
    • implicit with automatic handling of Empty oneof for sealed_value
    • implicit with automatic handling of Unrecognized for enum
    • ability to automatically unwrap non-AnyVal value type (enabled with a flag) which can be used to unwrap oneof values (#531, fixed in #568)

v1.2.0

27 Jun 10:16
Compare
Choose a tag to compare

Changelog:

v1.1.0

07 Jun 15:28
Compare
Choose a tag to compare

Changelog:

  • updated Scala 2.13 to 2.13.14 (#526)

    • it's the first release implementing SIP-51
      which drops forward comparibility in standard library. It means that every library compiled with 2.13.14 or higher will
      evict standard library to higher version - and since the compiler cannot be at lower version than the .ibrary it will also force
      Scala version update. This change was reade to merge before Chimney 1.0.0 but we postponed it to give people more time to migrate to this new convention
  • replaced Scala Native 0.4 with Scala Native 0.5 (#545) - while ideally we'd prefer to have a stepping-stone release cross-compiled for both 0.4 and 0.5,
    libries that Chimney depends on in its integrations (Cats, Scala Collection Compat, Scala Java Time, ScalaPB) moved directly to
    SN 0.5 dropping 0.4 on the spot

  • made the order of pattern-matching in sealed trait/enum transformation deterministic (useful for avoiding cache misses) (#543) - thanks to @reimai for the first contribution!

  • replaced hardcoded dependency on DSL's runtime overrides storage from macros internals (#552, fixed in #539)

    • this change unblocks the possibility to provide a different front-end to Chimneys macros (or using Chimney macros inside your macros). It would allow a development of, for instance:

      • Ducktape-like DSL without builder-API runtime overhead (value.transformInto(overrides))
      • Chimney-based lenses - currently Chimney can be used for lenses-like operations
        but it only works with .into.overrides.transform API and bears the costs of builder-API overhead
        (with different API it would be possible to update several nested fields with no overhead compared to manually written code!)
      • specialized derivations - initiatives like moia-oss/teleproto#321 would be able to call and customize Chimney macros directly,
        replace Chimney's Transformer with their own type class, add/remove derivation rules, etc. with collision with Chimney

      If you are interested in this, please contact us using GH discussions!

v1.0.0

23 May 04:49
Compare
Choose a tag to compare

Release 1.0.0 is the culmination of 7 years of development.

If you are curious about the migration from 0.8.x you'll find the guideline here (tl;dr there should be nothing to worry about as long as you recompile).

Changelog since 0.8.x:

  • revamped Cats' instances to match existing conventions (both in Cats as well as in Chimney) (fixed in #443)
    • Transformer, PartialTransformer and partial.Result have all instances that make sense for them
    • conversions from cats.Validated to partial.Result use the same convention as other types (using AsResult type class and asResult extension method introduced in 0.8.0)
    • for partial.Result and PartialTransformer one can combine values using sequential or parallel semantics (read about them in the docs!!!)
    • all instances are tested against Cats disciplines
  • further improvements to Cats' instances for Chimney types - added Alternative type class to the list of provided instances, a few missed discipline tests were added (#465)
  • provided a flag to disable automatic Option unwrapping by PartialTransformer (#322, addressed by #477) (disabling that behavior by default is not planned)
  • added a way to customize how source fields/subtypes are matches against target fields/subtypes (#89 and #480, fixed in #478) - thanks to @saeltz for contributing to the PR as the first contribution!
  • restored the behavior from before 0.8.x series when only methods returning Unit could be considered setters (provides a better fix to #424, fixed in #485). If needed non-Unit setters can be opted-in
  • detect and report ambiguities with pairing field names (#449, #461, fixed in #485)
  • improve error messages when there are def methods or other inherited accessors that could be enabled with a flag (fixed in #485)
  • type-level config representation and internal macros overrides get heavily refactored (#490, #491, #492) (breaking change!)
  • which unblocked the development of better nested paths (#493):
    • now it is possible to use overrides like withFieldConst(_.adt.matching[ADT.Subtype].either.matchingRight.collection.everyItem.map.everyMapValue, ...)
    • in this first iteration, improved paths to overridden values support only build-in Scala types: Option (matchingSome), Either (matchingLeft, matchingRight), Scala's collections (.everyItem, .everyMapKey, .everyMapValue) but it is planned to extends support for other collections
  • suppress WartRemover/Scapegoat warnings (#496, fixe),d in #497)
  • deprecate withCoproductInstance in favor or withSealedSubtypeHandled and withEnumCaseHandled (fixed in #500) - old name is still available but it was @deprecated since it uses the term "coproduct" basically unknown outside of library writers crowd
  • documentation now has light/dark theme toggle with the default being whatever your system uses
  • fixed to internal representation of subtype-matchiung configs (#499, fixed in #504)
  • format scaladoc documentation with scalafmt wrap = yes config
  • fix a bug that occurred in some cases when using withConstructorPartial (fixed in #508)
  • add withContructorEither in PartialTransformers to make it easier to work with smart constructors based on Either[String, Type] (done in #509)
  • created an integration API for providing custom optional types and custom collections (#505)
    • extended support for _.matchingSome, _.everyItem, _.everyMapKey,_.everyMapValue to every collection provided through integrations API
  • migrated chimney-java-collections through new integration API (#510)
  • provided support for transformation of cats.data types like Chain, NonEmptyChain, etc through integrations API (#421, fixed in #511)
  • allow providing an override to a field shared between all subtypes of an ADT (sealed, enum) (#512)
  • fix rare case of StackOverflow with Scala 3 enums (#528)
  • hide the last API intended for internal usage (#540)
  • tests Scala CLI snippets (#523, #524, #534) and extract snippet testing to an external library ScalaCLI.md Spec (#525)

v1.0.0-RC1

24 Apr 10:07
Compare
Choose a tag to compare
v1.0.0-RC1 Pre-release
Pre-release

This release candidate contains all the functionality intended for 1.0.0 launch. Please help us testing it for bugs. If no bugs - requiring changes to API and breaking binary/source compatibility - are found, Chimney 1.0.0 is planned to be released at 23.05.2024. Then it will move from early-semver to proper semantic versioning.

If you are curious about the migration from 0.8.x you'll find the guideline here (tl;dr there should be nothing to worry about as long as you recompile).

Changelog since 0.8.x:

  • revamped Cats' instances to match existing conventions (both in Cats as well as in Chimney) (fixed in #443)
    • Transformer, PartialTransformer and partial.Result have all instances that make sense for them
    • conversions from cats.Validated to partial.Result use the same convention as other types (using AsResult type class and asResult extension method introduced in 0.8.0)
    • for partial.Result and PartialTransformer one can combine values using sequential or parallel semantics (read about them in the docs!!!)
    • all instances are tested against Cats disciplines
  • further improvements to Cats' instances for Chimney types - added Alternative type class to the list of provided instances, a few missed discipline tests were added (#465)
  • provided a flag to disable automatic Option unwrapping by PartialTransformer (#322, addressed by #477) (disabling that behavior by default is not planned)
  • added a way to customize how source fields/subtypes are matches against target fields/subtypes (#89 and #480, fixed in #478) - thanks to @saeltz for contributing to the PR as the first contribution!
  • restored the behavior from before 0.8.x series when only methods returning Unit could be considered setters (provides a better fix to #424, fixed in #485). If needed non-Unit setters can be opted-in
  • detect and report ambiguities with pairing field names (#449, #461, fixed in #485)
  • improve error messages when there are def methods or other inherited accessors that could be enabled with a flag (fixed in #485)
  • type-level config representation and internal macros overrides get heavily refactored (#490, #491, #492) (breaking change!)
  • which unblocked the development of better nested paths (#493):
    • now it is possible to use overrides like withFieldConst(_.adt.matching[ADT.Subtype].either.matchingRight.collection.everyItem.map.everyMapValue, ...)
    • in this first iteration, improved paths to overridden values support only build-in Scala types: Option (matchingSome), Either (matchingLeft, matchingRight), Scala's collections (.everyItem, .everyMapKey, .everyMapValue) but it is planned to extends support for other collections
  • suppress WartRemover/Scapegoat warnings (#496, fixed in #497)
  • deprecate withCoproductInstance in favor or withSealedSubtypeHandled and withEnumCaseHandled (fixed in #500) - old name is still available but it was @deprecated since it uses the term "coproduct" basically unknown outside of library writers crowd
  • documentation now has light/dark theme toggle with the default being whatever your system uses
  • fixed to internal representation of subtype-matchiung configs (#499, fixed in #504)
  • format scaladoc documentation with scalafmt wrap = yes config
  • fix a bug that occurred in some cases when using withConstructorPartial (fixed in #508)
  • add withContructorEither in PartialTransformers to make it easier to work with smart constructors based on Either[String, Type] (done in #509)
  • created an integration API for providing custom optional types and custom collections (#505)
    • extended support for _.matchingSome, _.everyItem, _.everyMapKey,_.everyMapValue to every collection provided through integrations API
  • migrated chimney-java-collections through new integration API (#510)
  • provided support for transformation of cats.data types like Chain, NonEmptyChain, etc through integrations API (#421, fixed in #511)
  • allow providing an override to a field shared between all subtypes of an ADT (sealed, enum) (#512)