Skip to content

Commit 6384548

Browse files
authored
Hotfix: fix a regression in 1.2.9 where ConfTags with similar paths were lost when module was included (#2136)
1 parent 171a28d commit 6384548

File tree

4 files changed

+37
-12
lines changed

4 files changed

+37
-12
lines changed

distage/distage-core-api/src/main/scala/izumi/distage/model/definition/BindingTag.scala

+5-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import izumi.fundamentals.platform.cache.CachedProductHashcode
55

66
import scala.language.implicitConversions
77

8-
/** An attachment that can be added to a binding using its `.tagged` method */
8+
/** An attachment that can be added to a binding using its `.tagged` method
9+
*
10+
* @note an inheritor of BindingTag must be an immutable case class
11+
* and all of its fields must be used in `equals` / `hashCode`.
12+
*/
913
trait BindingTag extends CachedProductHashcode { this: Product => }
1014

1115
object BindingTag {

distage/distage-extension-config/.jvm/src/test/scala/izumi/distage/config/ConfigTest.scala

+26-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package izumi.distage.config
22

33
import com.github.pshirshov.configapp.SealedTrait.CaseClass2
44
import com.github.pshirshov.configapp.SealedTrait2.{No, Yes}
5-
import com.github.pshirshov.configapp._
6-
import com.typesafe.config._
7-
import distage.Injector
8-
import izumi.distage.config.model.AppConfig
5+
import com.github.pshirshov.configapp.*
6+
import com.typesafe.config.*
7+
import distage.{Injector, Mode, Repo}
8+
import izumi.distage.config.model.{AppConfig, ConfTag}
99
import izumi.distage.model.PlannerInput
10+
import izumi.distage.model.definition.ModuleDef
1011
import org.scalatest.wordspec.AnyWordSpec
1112

1213
import scala.collection.immutable.ListSet
@@ -163,6 +164,27 @@ final class ConfigTest extends AnyWordSpec {
163164
assert(context2.get[Service[SealedCaseClass]].conf == SealedCaseClass(SealedTrait.CaseClass2(2, false, No)))
164165
}
165166

167+
"regression test: same path ConfTags are preserved when processing includes" in {
168+
final case class A()
169+
final case class B()
170+
final case class C()
171+
172+
val defn = new ModuleDef {
173+
tag(Repo.Prod)
174+
175+
include(new ConfigModuleDef {
176+
tag(Mode.Test)
177+
makeConfig[A]("x")
178+
makeConfig[B]("x")
179+
makeConfig[C]("x")
180+
})
181+
}
182+
183+
val confTags = defn.bindings.toList.flatMap(_.tags.collect { case c: ConfTag => c })
184+
185+
assert(confTags.map(_.tpe).toSet.size == 3)
186+
}
187+
166188
}
167189

168190
}

distage/distage-extension-config/src/main/scala/izumi/distage/config/ConfigModuleDef.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ object ConfigModuleDef {
4444
final class FromConfig[T](private val make: MakeDSL[T]) extends AnyVal {
4545
def fromConfig(path: String)(implicit tag: Tag[T], dec: DIConfigReader[T], meta: DIConfigMeta[T]): MakeDSLUnnamedAfterFrom[T] = {
4646
val parser = wireConfig[T](path)
47-
make.tagged(ConfTag(path)(parser, meta.tpe)).from(parser)
47+
make.tagged(ConfTag(path, parser, meta.tpe)).from(parser)
4848
}
4949
def fromConfigNamed(path: String)(implicit tag: Tag[T], dec: DIConfigReader[T], meta: DIConfigMeta[T]): MakeDSLNamedAfterFrom[T] = {
5050
val parser = wireConfig[T](path)
51-
make.named(path).tagged(ConfTag(path)(parser, meta.tpe)).from(parser)
51+
make.named(path).tagged(ConfTag(path, parser, meta.tpe)).from(parser)
5252
}
5353
def fromConfigWithDefault(path: String)(default: => T)(implicit tag: Tag[T], dec: DIConfigReader[T], meta: DIConfigMeta[T]): MakeDSLUnnamedAfterFrom[T] = {
5454
val parser = wireConfigWithDefault[T](path)(default)
55-
make.tagged(ConfTag(path)(parser, meta.tpe)).from(parser)
55+
make.tagged(ConfTag(path, parser, meta.tpe)).from(parser)
5656
}
5757
}
5858

distage/distage-extension-config/src/main/scala/izumi/distage/config/model/ConfTag.scala

+3-4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import izumi.distage.config.codec.ConfigMetaType
44
import izumi.distage.model.definition.BindingTag
55

66
final case class ConfTag(
7-
confPath: String
8-
)(/* excluded from equals/hashCode */
9-
val parser: AppConfig => Any,
10-
val tpe: ConfigMetaType,
7+
confPath: String,
8+
parser: AppConfig => Any,
9+
tpe: ConfigMetaType,
1110
) extends BindingTag

0 commit comments

Comments
 (0)