From 1021f0788a9f6a1ec4d14ca84ff5f31a4d8602a6 Mon Sep 17 00:00:00 2001 From: Mateusz Kubuszok Date: Tue, 9 Aug 2022 22:11:53 +0200 Subject: [PATCH 1/4] Default values usage require explicit enabling (changed default setting) --- .../scala/io/scalaland/chimney/dsl/FlagsDsl.scala | 8 ++++---- .../internal/macros/TransformerConfigSupport.scala | 2 +- .../test/scala/io/scalaland/chimney/DslSpec.scala | 8 ++++++-- docs/source/transformers/default-values.rst | 13 +++++++++---- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/chimney/src/main/scala/io/scalaland/chimney/dsl/FlagsDsl.scala b/chimney/src/main/scala/io/scalaland/chimney/dsl/FlagsDsl.scala index 1c31a195d..e9c438681 100644 --- a/chimney/src/main/scala/io/scalaland/chimney/dsl/FlagsDsl.scala +++ b/chimney/src/main/scala/io/scalaland/chimney/dsl/FlagsDsl.scala @@ -23,16 +23,16 @@ trait FlagsDsl[UpdateFlag[_ <: TransformerFlags], Flags <: TransformerFlags] { /** Enable fallback to default case class values in `To` type. * - * @see [[https://scalalandio.github.io/chimney/transformers/default-values.html#disabling-default-values-in-generated-transformer]] for more details + * By default in such case derivation will fail. By enabling this flag, derivation will fallback to default value. + * + * @see [[https://scalalandio.github.io/chimney/transformers/default-values.html#enabling-default-values-in-generated-transformer]] for more details */ def enableDefaultValues: UpdateFlag[Enable[DefaultValues, Flags]] = enableFlag[DefaultValues] /** Fail derivation if `From` type is missing field even if `To` has default value for it. * - * By default in such case derivation will fallback to default values. - * - * @see [[https://scalalandio.github.io/chimney/transformers/default-values.html#disabling-default-values-in-generated-transformer]] for more details + * @see [[https://scalalandio.github.io/chimney/transformers/default-values.html#enabling-default-values-in-generated-transformer]] for more details */ def disableDefaultValues: UpdateFlag[Disable[DefaultValues, Flags]] = disableFlag[DefaultValues] diff --git a/chimney/src/main/scala/io/scalaland/chimney/internal/macros/TransformerConfigSupport.scala b/chimney/src/main/scala/io/scalaland/chimney/internal/macros/TransformerConfigSupport.scala index 51e07be86..69a99f9a5 100644 --- a/chimney/src/main/scala/io/scalaland/chimney/internal/macros/TransformerConfigSupport.scala +++ b/chimney/src/main/scala/io/scalaland/chimney/internal/macros/TransformerConfigSupport.scala @@ -174,7 +174,7 @@ trait TransformerConfigSupport extends MacroUtils { case class TransformerFlags( methodAccessors: Boolean = false, - processDefaultValues: Boolean = true, + processDefaultValues: Boolean = false, beanSetters: Boolean = false, beanGetters: Boolean = false, optionDefaultsToNone: Boolean = false, diff --git a/chimney/src/test/scala/io/scalaland/chimney/DslSpec.scala b/chimney/src/test/scala/io/scalaland/chimney/DslSpec.scala index bdde162d3..38cca3d4b 100644 --- a/chimney/src/test/scala/io/scalaland/chimney/DslSpec.scala +++ b/chimney/src/test/scala/io/scalaland/chimney/DslSpec.scala @@ -114,8 +114,11 @@ object DslSpec extends TestSuite { } "not use None as default when other default value is set" - { - SomeFoo("foo").into[Foobar2].transform ==> Foobar2("foo", Some(42)) - SomeFoo("foo").into[Foobar2].enableOptionDefaultsToNone.transform ==> Foobar2("foo", Some(42)) + SomeFoo("foo").into[Foobar2].enableDefaultValues.transform ==> Foobar2("foo", Some(42)) + SomeFoo("foo").into[Foobar2].enableDefaultValues.enableOptionDefaultsToNone.transform ==> Foobar2( + "foo", + Some(42) + ) } "not compile if default value is missing and no .enableOptionDefaultsToNone" - { @@ -199,6 +202,7 @@ object DslSpec extends TestSuite { case class Baahr(x: Int, y: Bar) "use default parameter value" - { + implicit val cfg = TransformerConfiguration.default.enableDefaultValues "field does not exists - the source" - { Foo(10).transformInto[Bar] ==> Bar(10, 30L) diff --git a/docs/source/transformers/default-values.rst b/docs/source/transformers/default-values.rst index 787a06606..aed6564ff 100644 --- a/docs/source/transformers/default-values.rst +++ b/docs/source/transformers/default-values.rst @@ -30,17 +30,17 @@ Providing the value manually has always a priority over the default. // Butterfly(5, "Steve", "yellow") -Disabling default values in generated transformer +Enabling default values in generated transformer ------------------------------------------------- -Using ``.disableDefaultValues`` operation it's possible to disable -lookup for default values and require them always to be passed explicitly. +Using ``.enableDefaultValues`` operation it's possible to enable +lookup for default values and fallback to default when there is no transformer +or config setting the value for field. .. code-block:: scala val steve = stevie .into[Butterfly] - .disableDefaultValues .transform // error: Chimney can't derive transformation from Catterpillar to Butterfly // @@ -52,6 +52,11 @@ lookup for default values and require them always to be passed explicitly. // .transform // ^ + // this one will succeed + val steve = stevie + .into[Butterfly] + .enableDefaultValues + .transform Default values for ``Option`` fields ------------------------------------ From feb30f165078824d4109a89e3fe7d1a2edf4551b Mon Sep 17 00:00:00 2001 From: Mateusz Kubuszok Date: Fri, 18 Nov 2022 16:11:54 +0100 Subject: [PATCH 2/4] Update documentation for default values option --- docs/source/transformers/default-values.rst | 50 +++++++-------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/docs/source/transformers/default-values.rst b/docs/source/transformers/default-values.rst index aed6564ff..115353b87 100644 --- a/docs/source/transformers/default-values.rst +++ b/docs/source/transformers/default-values.rst @@ -1,14 +1,15 @@ Default values support ====================== -Chimney respects case classes' default values as a possible target +Chimney allows case classes' default values as a possible target field value source. -Automatic value provision -------------------------- +Enabling default values in generated transformer +------------------------------------------------ -Field's default value is automatically used as a target value when constructing -target object. +Field's default value can be enabled as a target value when constructing +target object. The support for them has to be explicitly enabled to avoid +accidents. .. code-block:: scala @@ -17,31 +18,7 @@ target object. val stevie = Catterpillar(5, "Steve") - val steve = stevie.transformInto[Butterfly] - // Butterfly(5, "Steve", "purple") - -Providing the value manually has always a priority over the default. - -.. code-block:: scala - - val steve = stevie.into[Butterfly] - .withFieldConst(_.wingsColor, "yellow") - .transform - // Butterfly(5, "Steve", "yellow") - - -Enabling default values in generated transformer -------------------------------------------------- - -Using ``.enableDefaultValues`` operation it's possible to enable -lookup for default values and fallback to default when there is no transformer -or config setting the value for field. - -.. code-block:: scala - - val steve = stevie - .into[Butterfly] - .transform + //val steve = stevie.transformInto[Butterfly] // fails with // error: Chimney can't derive transformation from Catterpillar to Butterfly // // Butterfly @@ -51,12 +28,19 @@ or config setting the value for field. // // .transform // ^ + val steve = stevie.into[Butterfly].enableDefaultValues.transform + // Butterfly(5, "Steve", "purple") + +Providing the value manually has always a priority over the default. + +.. code-block:: scala - // this one will succeed - val steve = stevie - .into[Butterfly] + val steve = stevie.into[Butterfly] .enableDefaultValues + .withFieldConst(_.wingsColor, "yellow") .transform + // Butterfly(5, "Steve", "yellow") + Default values for ``Option`` fields ------------------------------------ From 3bf6745981ec6b7999ad58dd8a374e85ef2e7c44 Mon Sep 17 00:00:00 2001 From: Mateusz Kubuszok Date: Fri, 16 Dec 2022 11:57:42 +0100 Subject: [PATCH 3/4] Add warning to Sphinx docs about change of defaults handling --- docs/source/transformers/default-values.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/source/transformers/default-values.rst b/docs/source/transformers/default-values.rst index 115353b87..8c29a275e 100644 --- a/docs/source/transformers/default-values.rst +++ b/docs/source/transformers/default-values.rst @@ -7,6 +7,11 @@ field value source. Enabling default values in generated transformer ------------------------------------------------ +.. warning:: + + Before 0.7.0 default values was enabled by default. Due to feedback it was + changed to disabled by default for safety. + Field's default value can be enabled as a target value when constructing target object. The support for them has to be explicitly enabled to avoid accidents. From 858b9462b50591a7dbf555eb5b7638149e166bd8 Mon Sep 17 00:00:00 2001 From: Mateusz Kubuszok Date: Fri, 16 Dec 2022 12:55:08 +0100 Subject: [PATCH 4/4] Reword warning on default values and add documentation building tip to README --- README.md | 5 +++++ docs/source/transformers/default-values.rst | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 154b33494..6f6d006d7 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,11 @@ sbt makeSite HTML Documentation should be generated at `target/sphinx/html/index.html`. +Alternatively use Docker: + +```bash +docker run --rm -v ./docs:/docs sphinxdoc/sphinx:3.2.1 bash -c "pip install sphinx-rtd-theme && make html" +``` ## Thanks diff --git a/docs/source/transformers/default-values.rst b/docs/source/transformers/default-values.rst index 8c29a275e..fc20f0277 100644 --- a/docs/source/transformers/default-values.rst +++ b/docs/source/transformers/default-values.rst @@ -9,8 +9,8 @@ Enabling default values in generated transformer .. warning:: - Before 0.7.0 default values was enabled by default. Due to feedback it was - changed to disabled by default for safety. + Prior to version 0.7.0 fallback to default values was automatically enabled + and required explicit disabling. Field's default value can be enabled as a target value when constructing target object. The support for them has to be explicitly enabled to avoid