Repository: 7mind/izumi
Pull request #909 (2020-02-19 16:19:35)

Add `application.conf` to default configs in distage-framework, add `PlannerInput.target`, `Activation.empty`


Patch:
diff --git a/distage/distage-core-api/src/main/scala/izumi/distage/model/PlannerInput.scala b/distage/distage-core-api/src/main/scala/izumi/distage/model/PlannerInput.scala
index edd476217..59e6e9af5 100644
--- a/distage/distage-core-api/src/main/scala/izumi/distage/model/PlannerInput.scala
+++ b/distage/distage-core-api/src/main/scala/izumi/distage/model/PlannerInput.scala
@@ -2,7 +2,8 @@ package izumi.distage.model
 
 import izumi.distage.model.definition.ModuleBase
 import izumi.distage.model.plan.GCMode
-import izumi.distage.model.reflection.universe.RuntimeDIUniverse._
+import izumi.distage.model.reflection.universe.RuntimeDIUniverse.DIKey
+import izumi.fundamentals.reflection.Tags.Tag
 
 /**
   * Input for [[Planner]]
@@ -13,8 +14,12 @@ import izumi.distage.model.reflection.universe.RuntimeDIUniverse._
   *                 Garbage collector will remove all bindings that aren't direct or indirect dependencies
   *                 of the chosen root DIKeys from the plan - they will never be instantiated.
   *
+  *                 Effectively, garbage collector selects and creates a *sub-graph* of the largest possible object graph
+  *                 that can be described by `bindings`, the sub-graph that can includes components designated as `roots`
+  *                 and their required dependencies.
+  *
   *                 On [[GCMode.NoGC]] garbage collection will not be performed – that would be equivalent to
-  *                 designating _all_ DIKeys as roots.
+  *                 designating _all_ DIKeys as roots. _Everything_ described in `bindings` will be instantiated eagerly.
   */
 final case class PlannerInput(
                                bindings: ModuleBase,
@@ -22,8 +27,26 @@ final case class PlannerInput(
                              )
 
 object PlannerInput {
-  def apply(bindings: ModuleBase, root: DIKey, roots: DIKey*): PlannerInput = PlannerInput(bindings, GCMode(root, roots: _*))
+  /**
+    * Instantiate `roots` and the dependencies of `roots`, discarding bindings that are unrelated.
+    *
+    * Effectively, this selects and creates a *sub-graph* of the largest possible object graph
+    * that can be described by `bindings`
+    */
   def apply(bindings: ModuleBase, roots: Set[DIKey]): PlannerInput = PlannerInput(bindings, GCMode(roots))
 
+  /** Instantiate `root`, `roots` and their dependencies, discarding bindings that are unrelated. */
+  def apply(bindings: ModuleBase, root: DIKey, roots: DIKey*): PlannerInput = PlannerInput(bindings, GCMode(root, roots: _*))
+
+  /** Instantiate `T` and the dependencies of `T`, discarding bindings that are unrelated. */
+  def target[T: Tag](bindings: ModuleBase): PlannerInput = PlannerInput(bindings, DIKey.get[T])
+
+  /** Instantiate `T @Id(name)` and the dependencies of `T @Id(name)`, discarding bindings that are unrelated.
+    *
+    * @see [[izumi.distage.model.definition.Id @Id annotation]] */
+  def target[T: Tag](name: String)(bindings: ModuleBase): PlannerInput = PlannerInput(bindings, DIKey.get[T].named(name))
+
+  /** Disable all pruning.
+    * Every binding in `bindings` will be instantiated eagerly, without selection */
   def noGc(bindings: ModuleBase): PlannerInput = PlannerInput(bindings, GCMode.NoGC)
 }
diff --git a/distage/distage-core-api/src/main/scala/izumi/distage/model/Producer.scala b/distage/distage-core-api/src/main/scala/izumi/distage/model/Producer.scala
index 41260bf75..490b85110 100644
--- a/distage/distage-core-api/src/main/scala/izumi/distage/model/Producer.scala
+++ b/distage/distage-core-api/src/main/scala/izumi/distage/model/Producer.scala
@@ -2,7 +2,6 @@ package izumi.distage.model
 
 import izumi.distage.model.definition.DIResource.DIResourceBase
 import izumi.distage.model.effect.DIEffect
-import izumi.distage.model.effect.DIEffect.syntax._
 import izumi.distage.model.plan.OrderedPlan
 import izumi.distage.model.provisioning.PlanInterpreter.{FailedProvision, FinalizerFilter}
 import izumi.fundamentals.platform.functional.Identity
diff --git a/distage/distage-core-api/src/main/scala/izumi/distage/model/definition/Activation.scala b/distage/distage-core-api/src/main/scala/izumi/distage/model/definition/Activation.scala
index 0b009821c..bb1a479a6 100644
--- a/distage/distage-core-api/src/main/scala/izumi/distage/model/definition/Activation.scala
+++ b/distage/distage-core-api/src/main/scala/izumi/distage/model/definition/Activation.scala
@@ -3,10 +3,10 @@ package izumi.distage.model.definition
 import izumi.distage.model.definition.Axis.AxisValue
 
 final case class Activation(activeChoices: Map[Axis, AxisValue]) extends AnyVal {
-  def ++(activation: Activation) = Activation(activeChoices ++ activation.activeChoices)
+  def ++(activation: Activation): Activation = Activation(activeChoices ++ activation.activeChoices)
 }
 
 object Activation {
   def apply(activeChoices: (Axis, AxisValue)*): Activation = Activation(Map(activeChoices: _*))
-  def empty: Activation = Activation()
+  val empty: Activation = new Activation(Map.empty)
 }
diff --git a/distage/distage-core-api/src/main/scala/izumi/distage/model/reflection/universe/RuntimeDIUniverse/RuntimeDIUniverse.scala b/distage/distage-core-api/src/main/scala/izumi/distage/model/reflection/universe/RuntimeDIUniverse/RuntimeDIUniverse.scala
index 072286183..c699f90e4 100644
--- a/distage/distage-core-api/src/main/scala/izumi/distage/model/reflection/universe/RuntimeDIUniverse/RuntimeDIUniverse.scala
+++ b/distage/distage-core-api/src/main/scala/izumi/distage/model/reflection/universe/RuntimeDIUniverse/RuntimeDIUniverse.scala
@@ -33,7 +33,7 @@ object Association {
 final case class SymbolInfo(
                              name: String,
                              finalResultType: SafeType,
-                             // no custom annotation support since 0.10.0... open an issue if desired!
+                             // no custom annotation support since 0.10.0... please comment on github issue https://github.com/7mind/izumi/issues/906 if desired!
                              // annotations: List[u.Annotation]
                              isByName: Boolean,
                              wasGeneric: Boolean,
diff --git a/distage/distage-core/src/main/scala/izumi/distage/planning/PruningPlanMergingPolicyDefaultImpl.scala b/distage/distage-core/src/main/scala/izumi/distage/planning/PruningPlanMergingPolicyDefaultImpl.scala
index eb84fb9b2..e41022c4a 100644
--- a/distage/distage-core/src/main/scala/izumi/distage/planning/PruningPlanMergingPolicyDefaultImpl.scala
+++ b/distage/distage-core/src/main/scala/izumi/distage/planning/PruningPlanMergingPolicyDefaultImpl.scala
@@ -1,6 +1,6 @@
 package izumi.distage.planning
 
-import izumi.distage.model.definition.{Activation, BindingTag}
+import izumi.distage.model.definition.{Activation, Axis, BindingTag}
 import izumi.distage.model.exceptions.ConflictingDIKeyBindingsException
 import izumi.distage.model.plan.ExecutableOp.SemiplanOp
 import izumi.distage.model.plan._
@@ -21,7 +21,7 @@ class PruningPlanMergingPolicyDefaultImpl
   activation: Activation,
 ) extends PlanMergingPolicyDefaultImpl {
 
-  private[this] val activeChoices = activation.activeChoices.values.toSet
+  private[this] val activeChoices: Set[Axis.AxisValue] = activation.activeChoices.values.toSet
 
   protected def logUntaggedConflicts(@unused key: DIKey, @unused noTags: Set[PrePlan.JustOp]): Unit = {}
   protected def logHandleIssues(@unused issues: Map[DIKey, DIKeyConflictResolution.Failed]): Unit = {}
diff --git a/distage/distage-framework/src/main/scala/izumi/distage/framework/services/ConfigLoader.scala b/distage/distage-framework/src/main/scala/izumi/distage/framework/services/ConfigLoader.scala
index 700366a6b..500f1b81d 100644
--- a/distage/distage-framework/src/main/scala/izumi/distage/framework/services/ConfigLoader.scala
+++ b/distage/distage-framework/src/main/scala/izumi/distage/framework/services/ConfigLoader.scala
@@ -4,6 +4,7 @@ import java.io.File
 
 import com.typesafe.config.{Config, ConfigFactory}
 import distage.config.AppConfig
+import izumi.distage.framework.services.ConfigLoader.LocalFSImpl.{ConfigSource, ResourceConfigKind}
 import izumi.fundamentals.platform.resources.IzResources
 import izumi.fundamentals.platform.strings.IzString._
 import izumi.logstage.api.IzLogger
@@ -11,6 +12,18 @@ import izumi.logstage.api.IzLogger
 import scala.jdk.CollectionConverters._
 import scala.util.{Failure, Success, Try}
 
+/**
+  * Default config resources:
+  *   - $roleName.conf
+  *   - $roleName-reference.conf
+  *   - $roleName-reference-dev.conf
+  *   - application.conf
+  *   - application-reference.conf
+  *   - application-reference-dev.conf
+  *   - common.conf
+  *   - common-reference.conf
+  *   - common-reference-dev.conf
+  */
 trait ConfigLoader {
   def buildConfig(): AppConfig
 
@@ -18,34 +31,25 @@ trait ConfigLoader {
 }
 
 object ConfigLoader {
-
-  /**
-   * default config locations:
-   *   - common.conf
-   *   - common-reference.conf
-   *   - common-reference-dev.conf
-   *   - $roleName.conf
-   *   - $roleName-reference.conf
-   *   - $roleName-reference-dev.conf
-   */
   class LocalFSImpl(
     logger: IzLogger,
-    primaryConfig: Option[File],
+    baseConfig: Option[File],
     roleConfigs: Map[String, Option[File]],
   ) extends ConfigLoader {
 
-    import LocalFSImpl._
+    protected def defaultBaseConfigs: Seq[String] = Seq("application", "common")
 
     def buildConfig(): AppConfig = {
-      val commonConfigFile = toConfig("common", primaryConfig)
+      val commonConfigFiles = baseConfig.fold(
+        defaultBaseConfigs.flatMap(toConfig(_, baseConfig))
+      )(f => Seq(ConfigSource.File(f)))
 
       val roleConfigFiles = roleConfigs.flatMap {
         case (roleName, roleConfig) =>
           toConfig(roleName, roleConfig)
-      }
-        .toList
+      }.toList
 
-      val allConfigs = roleConfigFiles ++ commonConfigFile
+      val allConfigs = roleConfigFiles ++ commonConfigFiles
 
       val cfgInfo = allConfigs.map {
         case r: ConfigSource.Resource =>
@@ -96,14 +100,6 @@ object ConfigLoader {
       AppConfig(config)
     }
 
-    protected def defaultConfigReferences(name: String): Seq[ConfigSource] = {
-      Seq(
-        ConfigSource.Resource(s"$name.conf", ResourceConfigKind.Primary),
-        ConfigSource.Resource(s"$name-reference.conf", ResourceConfigKind.Primary),
-        ConfigSource.Resource(s"$name-reference-dev.conf", ResourceConfigKind.Development),
-      )
-    }
-
     protected def foldConfigs(roleConfigs: Seq[(ConfigSource, Config)]): Config = {
       roleConfigs.foldLeft(ConfigFactory.empty()) {
         case (acc, (src, cfg)) =>
@@ -125,11 +121,16 @@ object ConfigLoader {
       }
     }
 
-    private def toConfig(name: String, maybeConfigFile: Option[File]): Seq[ConfigSource] = {
-      maybeConfigFile.fold(defaultConfigReferences(name)) {
-        f =>
-          Seq(ConfigSource.File(f))
-      }
+    protected def toConfig(name: String, maybeConfigFile: Option[File]): Seq[ConfigSource] = {
+      maybeConfigFile.fold(defaultConfigReferences(name))(f => Seq(ConfigSource.File(f)))
+    }
+
+    protected def defaultConfigReferences(name: String): Seq[ConfigSource] = {
+      Seq(
+        ConfigSource.Resource(s"$name.conf", ResourceConfigKind.Primary),
+        ConfigSource.Resource(s"$name-reference.conf", ResourceConfigKind.Primary),
+        ConfigSource.Resource(s"$name-reference-dev.conf", ResourceConfigKind.Development),
+      )
     }
   }
 
diff --git a/distage/distage-framework/src/main/scala/izumi/distage/framework/services/ModuleProvider.scala b/distage/distage-framework/src/main/scala/izumi/distage/framework/services/ModuleProvider.scala
index 265e9d823..9cf7ee048 100644
--- a/distage/distage-framework/src/main/scala/izumi/distage/framework/services/ModuleProvider.scala
+++ b/distage/distage-framework/src/main/scala/izumi/distage/framework/services/ModuleProvider.scala
@@ -52,7 +52,8 @@ object ModuleProvider {
 
       val resourceRewriter = new BootstrapModuleDef {
         make[RewriteRules].fromValue(options.rewriteRules)
-        many[PlanningHook].add[ResourceRewriter]
+        many[PlanningHook]
+          .add[ResourceRewriter]
       }
 
       Seq(
diff --git a/distage/distage-framework/src/main/scala/izumi/distage/roles/RoleAppLauncherImpl.scala b/distage/distage-framework/src/main/scala/izumi/distage/roles/RoleAppLauncherImpl.scala
index 3ba302238..82c3d9ca2 100644
--- a/distage/distage-framework/src/main/scala/izumi/distage/roles/RoleAppLauncherImpl.scala
+++ b/distage/distage-framework/src/main/scala/izumi/distage/roles/RoleAppLauncherImpl.scala
@@ -21,7 +21,7 @@ import izumi.fundamentals.platform.cli.model.raw.RawAppArgs
 import izumi.fundamentals.platform.language.unused
 import izumi.fundamentals.platform.resources.IzManifest
 import izumi.fundamentals.platform.strings.IzString._
-import izumi.logstage.api.IzLogger
+import izumi.logstage.api.{IzLogger, Log}
 import izumi.logstage.api.logger.LogRouter
 
 import scala.reflect.ClassTag
@@ -58,8 +58,11 @@ abstract class RoleAppLauncherImpl[F[_]: TagK: DIEffect] extends RoleAppLauncher
   protected def defaultActivations: Activation = StandardAxis.prodActivation
   protected def requiredActivations: Activation = Activation.empty
 
+  protected def defaultLogLevel: Log.Level = Log.Level.Info
+  protected def defaultLogFormatJson: Boolean = false
+
   def launch(parameters: RawAppArgs): Unit = {
-    val earlyLogger = EarlyLoggers.makeEarlyLogger(parameters)
+    val earlyLogger = EarlyLoggers.makeEarlyLogger(parameters, defaultLogLevel = Log.Level.Info)
     showBanner(earlyLogger, referenceLibraryInfo)
 
     val bsPlugins = makeBootstrapPluginLoader().load(bootstrapPluginConfig)
@@ -72,7 +75,7 @@ abstract class RoleAppLauncherImpl[F[_]: TagK: DIEffect] extends RoleAppLauncher
     earlyLogger.info(s"Loaded ${bsDefinition.bindings.size -> "bootstrap bindings"}...")
 
     val config = makeConfigLoader(earlyLogger, parameters).buildConfig()
-    val lateLogger = EarlyLoggers.makeLateLogger(parameters, earlyLogger, config)
+    val lateLogger = EarlyLoggers.makeLateLogger(parameters, earlyLogger, config, defaultLogLevel, defaultLogFormatJson)
 
     val mergeStrategy = makeMergeStrategy(lateLogger, parameters, roles)
     val appDefinition = mergeStrategy.merge(appPlugins)
@@ -201,7 +204,6 @@ abstract class RoleAppLauncherImpl[F[_]: TagK: DIEffect] extends RoleAppLauncher
 
   protected def makeConfigLoader(logger: IzLogger, parameters: RawAppArgs): ConfigLoader = {
     val maybeGlobalConfig = parameters.globalParameters.findValue(Options.configParam).asFile
-
     val roleConfigs = parameters.roles.map {
       roleParams =>
         roleParams.role -> roleParams.roleParameters.findValue(Options.configParam).asFile
diff --git a/distage/distage-framework/src/main/scala/izumi/distage/roles/bundled/ConfigWriter.scala b/distage/distage-framework/src/main/scala/izumi/distage/roles/bundled/ConfigWriter.scala
index c70efb7dd..83387feb9 100644
--- a/distage/distage-framework/src/main/scala/izumi/distage/roles/bundled/ConfigWriter.scala
+++ b/distage/distage-framework/src/main/scala/izumi/distage/roles/bundled/ConfigWriter.scala
@@ -26,10 +26,10 @@ import izumi.logstage.distage.LogstageModule
 import scala.util._
 
 
-class ConfigWriter[F[_] : DIEffect]
+class ConfigWriter[F[_]: DIEffect]
 (
   logger: IzLogger,
-  launcherVersion: ArtifactVersion@Id("launcher-version"),
+  launcherVersion: ArtifactVersion @Id("launcher-version"),
   roleInfo: RolesInfo,
   context: RoleAppPlanner[F],
   //appModule: ModuleBase@Id("application.module"),
diff --git a/distage/distage-framework/src/main/scala/izumi/distage/roles/services/EarlyLoggers.scala b/distage/distage-framework/src/main/scala/izumi/distage/roles/services/EarlyLoggers.scala
index 30174c443..0e95999c6 100644
--- a/distage/distage-framework/src/main/scala/izumi/distage/roles/services/EarlyLoggers.scala
+++ b/distage/distage-framework/src/main/scala/izumi/distage/roles/services/EarlyLoggers.scala
@@ -11,17 +11,14 @@ import izumi.logstage.api.{IzLogger, Log}
 import scala.util.Try
 
 object EarlyLoggers {
-  private[this] final val defaultLogLevel = Log.Level.Info
-  private[this] final val defaultLogFormatJson = false
-
-  def makeEarlyLogger(parameters: RawAppArgs): IzLogger = {
-    val rootLogLevel = getRootLogLevel(parameters.globalParameters)
+  def makeEarlyLogger(parameters: RawAppArgs, defaultLogLevel: Log.Level): IzLogger = {
+    val rootLogLevel = getRootLogLevel(parameters.globalParameters, defaultLogLevel)
     IzLogger(rootLogLevel)("phase" -> "early")
   }
 
-  def makeLateLogger(parameters: RawAppArgs, earlyLogger: IzLogger, config: AppConfig): IzLogger = {
-    val rootLogLevel = getRootLogLevel(parameters.globalParameters)
-    val logJson = getLogFormatJson(parameters.globalParameters)
+  def makeLateLogger(parameters: RawAppArgs, earlyLogger: IzLogger, config: AppConfig, defaultLogLevel: Log.Level, defaultLogFormatJson: Boolean): IzLogger = {
+    val rootLogLevel = getRootLogLevel(parameters.globalParameters, defaultLogLevel)
+    val logJson = getLogFormatJson(parameters.globalParameters, defaultLogFormatJson)
     val loggerConfig = Try(config.config.getConfig("logger")).getOrElse(ConfigFactory.empty("Couldn't parse `logger` configuration"))
     val router = new SimpleLoggerConfigurator(earlyLogger)
       .makeLogRouter(
@@ -33,13 +30,13 @@ object EarlyLoggers {
     IzLogger(router)("phase" -> "late")
   }
 
-  private def getRootLogLevel(parameters: RawEntrypointParams): Level = {
+  private def getRootLogLevel(parameters: RawEntrypointParams, defaultLogLevel: Log.Level): Level = {
     parameters.findValue(Options.logLevelRootParam)
       .map(v => Log.Level.parseSafe(v.value, defaultLogLevel))
       .getOrElse(defaultLogLevel)
   }
 
-  private def getLogFormatJson(parameters: RawEntrypointParams): Boolean = {
+  private def getLogFormatJson(parameters: RawEntrypointParams, defaultLogFormatJson: Boolean): Boolean = {
     parameters.findValue(Options.logFormatParam)
       .map(_.value == "json")
       .getOrElse(defaultLogFormatJson)
diff --git a/doc/microsite/src/main/tut/logstage/00_logstage.md b/doc/microsite/src/main/tut/logstage/00_logstage.md
index 8a4c62457..782bce913 100644
--- a/doc/microsite/src/main/tut/logstage/00_logstage.md
+++ b/doc/microsite/src/main/tut/logstage/00_logstage.md
@@ -217,7 +217,3 @@ val myLogger = IzLogger()
 // configure SLF4j to use the same router that `myLogger` uses
 StaticLogRouter.instance.setup(myLogger.router)
 ```
-
-@@@ index
-
-@@@
diff --git a/fundamentals/fundamentals-thirdparty-boopickle-shaded/src/main/scala/izumi/thirdparty/internal/boopickle/PicklerMaterializersImpl.scala b/fundamentals/fundamentals-thirdparty-boopickle-shaded/src/main/scala/izumi/thirdparty/internal/boopickle/PicklerMaterializersImpl.scala
index 8352b25d0..9c4d09f6e 100644
--- a/fundamentals/fundamentals-thirdparty-boopickle-shaded/src/main/scala/izumi/thirdparty/internal/boopickle/PicklerMaterializersImpl.scala
+++ b/fundamentals/fundamentals-thirdparty-boopickle-shaded/src/main/scala/izumi/thirdparty/internal/boopickle/PicklerMaterializersImpl.scala
@@ -4,7 +4,7 @@ import scala.reflect.macros.blackbox
 
 private[izumi] object PicklerMaterializersImpl {
 
-  private var logmacro = {
+  private val logmacro = {
     val prop = System.getProperty("boopickle.logmacro")
     prop != null && prop.toLowerCase == "true"
   }
diff --git a/logstage/logstage-core/src/main/scala/izumi/logstage/api/logger/LogRouter.scala b/logstage/logstage-core/src/main/scala/izumi/logstage/api/logger/LogRouter.scala
index 5acda2970..ec7cf5103 100644
--- a/logstage/logstage-core/src/main/scala/izumi/logstage/api/logger/LogRouter.scala
+++ b/logstage/logstage-core/src/main/scala/izumi/logstage/api/logger/LogRouter.scala
@@ -5,9 +5,7 @@ import izumi.fundamentals.platform.console.TrivialLogger.Config
 import izumi.logstage.api.Log
 
 trait LogRouter extends AutoCloseable {
-
   def log(entry: Log.Entry): Unit
-
   def acceptable(id: Log.LoggerId, logLevel: Log.Level): Boolean
 
   override def close(): Unit = {}
diff --git a/logstage/logstage-core/src/main/scala/izumi/logstage/macros/DebugProperties.scala b/logstage/logstage-core/src/main/scala/izumi/logstage/macros/DebugProperties.scala
index 6361217bb..b720c394d 100644
--- a/logstage/logstage-core/src/main/scala/izumi/logstage/macros/DebugProperties.scala
+++ b/logstage/logstage-core/src/main/scala/izumi/logstage/macros/DebugProperties.scala
@@ -4,5 +4,4 @@ import izumi.fundamentals.platform.properties
 
 object DebugProperties extends properties.DebugProperties {
   final val `izumi.debug.macro.logstage` = Property("izumi.debug.macro.rtti")
-
 }


Test patch:
diff --git a/distage/distage-testkit-core/src/main/scala/izumi/distage/testkit/services/dstest/DistageTestRunner.scala b/distage/distage-testkit-core/src/main/scala/izumi/distage/testkit/services/dstest/DistageTestRunner.scala
index 15a4410ff..526db4877 100644
--- a/distage/distage-testkit-core/src/main/scala/izumi/distage/testkit/services/dstest/DistageTestRunner.scala
+++ b/distage/distage-testkit-core/src/main/scala/izumi/distage/testkit/services/dstest/DistageTestRunner.scala
@@ -27,6 +27,7 @@ import izumi.fundamentals.platform.language.CodePosition
 import izumi.fundamentals.platform.strings.IzString._
 import izumi.fundamentals.reflection.Tags.TagK
 import izumi.logstage.api.IzLogger
+import logstage.Log
 
 import scala.concurrent.ExecutionContext
 import scala.concurrent.duration.{Duration, FiniteDuration}
@@ -65,7 +66,7 @@ class DistageTestRunner[F[_] : TagK]
         }
         val config = loader.buildConfig()
 
-        val testRunnerLogger = EarlyLoggers.makeLateLogger(RawAppArgs.empty, earlyPhaseLogger, config)
+        val testRunnerLogger = EarlyLoggers.makeLateLogger(RawAppArgs.empty, earlyPhaseLogger, config, Log.Level.Info, defaultLogFormatJson = false)
 
         val checker = new IntegrationChecker.Impl[F](testRunnerLogger)
         testRunnerLogger.info(s"Processing env ${env.hashCode() -> "id"} with ${tests.size -> "tests"} in ${TagK[F].tag -> "monad"}, ${env.configPackage}, ${env.activation}")