Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

distage-roles: move *Impls to companion object #701

Merged
merged 2 commits into from
Oct 21, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,8 @@ lazy val `fundamentals-platform` = project.in(file("fundamentals/fundamentals-pl
libraryDependencies ++= Seq(
compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full),
"org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
"org.scalatest" %% "scalatest" % V.scalatest % Test
"org.scalatest" %% "scalatest" % V.scalatest % Test,
"org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided
)
)
.settings(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import izumi.distage.model.definition.{Binding, BindingTag, Id, ImplDef}
import izumi.distage.model.exceptions.{BadIdAnnotationException, ConflictingDIKeyBindingsException, ProvisioningException, UnsupportedWiringException}
import izumi.distage.model.plan.ExecutableOp.ImportDependency
import izumi.distage.reflection.SymbolIntrospectorDefaultImpl
import izumi.fundamentals.reflection.CodePositionMaterializer
import izumi.fundamentals.platform.language.CodePositionMaterializer
import org.scalatest.WordSpec

class BasicTest extends WordSpec with MkInjector {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package izumi.distage.model.definition

import izumi.distage.model.providers.ProviderMagnet
import izumi.distage.model.reflection.universe.RuntimeDIUniverse.{DIKey, SafeType, Tag}
import izumi.fundamentals.reflection.CodePositionMaterializer
import izumi.fundamentals.platform.language.CodePositionMaterializer

object Bindings {
import Binding._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ import izumi.distage.model.reflection.universe.RuntimeDIUniverse
import izumi.distage.model.reflection.universe.RuntimeDIUniverse.Wiring.SingletonWiring.Instance
import izumi.distage.model.reflection.universe.RuntimeDIUniverse._
import izumi.distage.model.{GCMode, Locator, definition}
import izumi.fundamentals.platform.language.SourceFilePosition
import izumi.fundamentals.reflection.CodePositionMaterializer
import izumi.fundamentals.platform.language.{CodePositionMaterializer, SourceFilePosition}

import scala.collection.mutable

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package izumi.distage.model.definition

import cats.Hash
import cats.kernel.{BoundedSemilattice, PartialOrder}
import izumi.distage.model.definition.ModuleBase.ModuleBaseInstances.{CatsBoundedSemilattice, CatsPartialOrderHash, ModuleBaseSemilattice}
import izumi.distage.model.definition.ModuleBaseInstances.{CatsBoundedSemilattice, CatsPartialOrderHash, ModuleBaseSemilattice}
import izumi.distage.model.reflection.universe.RuntimeDIUniverse.DIKey
import izumi.fundamentals.collections.IzCollections._
Expand Down Expand Up @@ -136,13 +137,14 @@ object ModuleBase {
private[definition] def tagwiseMerge(bs: Iterable[Binding]): Set[Binding] = {
val grouped = bs.groupBy(_.group)

val out = grouped
.map {
case (_, v) =>
//assert(v.forall(_.key == k.key), s"${k.key}, ${v.map(_.key)}")
v.reduce(_ addTags _.tags)
}
.to[ListSet]
val out = ListSet.newBuilder.++= {
grouped
.map {
case (_, v) =>
//assert(v.forall(_.key == k.key), s"${k.key}, ${v.map(_.key)}")
v.reduce(_ addTags _.tags)
}
}.result()
out
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ import izumi.distage.model.definition.dsl.AbstractBindingDefDSL.SingletonInstruc
import izumi.distage.model.definition.dsl.AbstractBindingDefDSL.{BindingRef, SetRef, SingletonInstruction, SingletonRef}
import izumi.distage.model.definition.{Binding, BindingTag, Bindings, ImplDef}
import izumi.distage.model.reflection.universe.RuntimeDIUniverse.{DIKey, IdContract, Tag}
import izumi.fundamentals.reflection.CodePositionMaterializer
import izumi.fundamentals.platform.language.Quirks._
import izumi.fundamentals.platform.language.SourceFilePosition
import izumi.fundamentals.platform.language.{CodePositionMaterializer, SourceFilePosition}

import scala.collection.mutable

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import izumi.distage.model.definition.dsl.AbstractBindingDefDSL.SingletonInstruc
import izumi.distage.model.definition.dsl.AbstractBindingDefDSL._
import izumi.distage.model.providers.ProviderMagnet
import izumi.distage.model.reflection.universe.RuntimeDIUniverse._
import izumi.fundamentals.platform.language.CodePositionMaterializer
import izumi.fundamentals.platform.language.Quirks.discard
import izumi.fundamentals.reflection.CodePositionMaterializer

/**
* DSL for defining module Bindings.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package izumi.distage.model.exceptions

import izumi.distage.model.reflection.universe.RuntimeDIUniverse
import izumi.fundamentals.reflection.CodePositionMaterializer
import izumi.fundamentals.platform.language.CodePositionMaterializer

class TODOBindingException(message: String, val target: RuntimeDIUniverse.DIKey, val sourcePosition: CodePositionMaterializer) extends DIException(message, null)
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package izumi.distage.model.providers

import izumi.distage.model.exceptions.TODOBindingException
import izumi.distage.model.reflection.macros.{ProviderMagnetMacro, ProviderMagnetMacroGenerateUnsafeWeakSafeTypes}
import izumi.distage.model.reflection.universe.RuntimeDIUniverse.{Association, DIKey, DependencyContext, Provider, SafeType, Tag, SymbolInfo}
import izumi.distage.model.reflection.universe.RuntimeDIUniverse.{Association, DIKey, DependencyContext, Provider, SafeType, SymbolInfo, Tag}
import izumi.fundamentals.platform.language.CodePositionMaterializer
import izumi.fundamentals.platform.language.Quirks._
import izumi.fundamentals.reflection.CodePositionMaterializer

import scala.language.experimental.macros
import scala.language.implicitConversions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import izumi.distage.model.providers.ProviderMagnet
import izumi.distage.model.reflection.universe.{RuntimeDIUniverse, StaticDIUniverse}
import izumi.distage.reflection.{DependencyKeyProviderDefaultImpl, SymbolIntrospectorDefaultImpl}
import izumi.fundamentals.reflection.macrortti.LightTypeTag
import izumi.fundamentals.reflection.{AnnotationTools, TrivialMacroLogger}
import izumi.fundamentals.reflection.{AnnotationTools, DebugProperties, TrivialMacroLogger}

import scala.reflect.macros.blackbox

Expand All @@ -25,7 +25,7 @@ class ProviderMagnetMacro(val c: blackbox.Context) {

final val macroUniverse = StaticDIUniverse(c)

private final val logger = TrivialMacroLogger.make[this.type](c, LightTypeTag.loggerId)
private final val logger = TrivialMacroLogger.make[this.type](c, izumi.fundamentals.reflection.DebugProperties.`izumi.debug.macro.rtti`)
private final val symbolIntrospector = SymbolIntrospectorDefaultImpl.Static(macroUniverse)
private final val keyProvider = DependencyKeyProviderDefaultImpl.Static(macroUniverse)(symbolIntrospector)
private final val tools =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package izumi.distage.roles

import cats.effect.LiftIO
import izumi.distage.config.model.AppConfig
import distage._
import izumi.distage.config.ConfigInjectionOptions
import izumi.distage.config.model.AppConfig
import izumi.distage.model.definition.Axis.AxisValue
import izumi.distage.model.definition.AxisBase
import izumi.distage.model.definition.StandardAxis.{Env, ExternalApi, Repo}
import izumi.distage.model.monadic.DIEffect
import izumi.distage.model.reflection.universe.MirrorProvider
import izumi.distage.plugins.merge.{PluginMergeStrategy, SimplePluginMergeStrategy}
import izumi.distage.roles.RoleAppLauncher.Options
import izumi.distage.roles.config.ContextOptions
import izumi.distage.roles.model.meta.{LibraryReference, RolesInfo}
import izumi.distage.roles.model.{AppActivation, DiAppBootstrapException}
import izumi.distage.roles.services.ModuleProviderImpl.ContextOptions
import izumi.distage.roles.services.PluginSource.AllLoadedPlugins
import izumi.distage.roles.services.ResourceRewriter.RewriteRules
import izumi.distage.roles.services._
Expand All @@ -22,10 +24,9 @@ import izumi.fundamentals.platform.language.Quirks
import izumi.fundamentals.platform.resources.IzManifest
import izumi.fundamentals.platform.strings.IzString._
import izumi.logstage.api.IzLogger
import distage._

import scala.concurrent.ExecutionContext
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.global
import scala.reflect.ClassTag

/**
Expand All @@ -49,8 +50,6 @@ import scala.reflect.ClassTag
*/
abstract class RoleAppLauncher[F[_] : TagK : DIEffect] {

import RoleAppLauncher._

private val loggers = new EarlyLoggers()

protected def bootstrapConfig: BootstrapConfig
Expand Down Expand Up @@ -101,19 +100,20 @@ abstract class RoleAppLauncher[F[_] : TagK : DIEffect] {

protected def bsOverride: BootstrapModule = BootstrapModule.empty

protected def defaultActivations: Map[AxisBase, AxisValue] = Map(
Env -> Env.Prod,
Repo -> Repo.Prod,
ExternalApi -> ExternalApi.Prod,
)

protected def defaultActivations: Map[AxisBase, AxisValue] = {
Map(
Env -> Env.Prod,
Repo -> Repo.Prod,
ExternalApi -> ExternalApi.Prod,
)
}
protected def requiredActivations: Map[AxisBase, AxisValue] = Map.empty

protected def gcRoots(rolesInfo: RolesInfo): Set[DIKey] = {
rolesInfo.requiredComponents
}

protected def makeBootstrapMergeStrategy(lateLogger: IzLogger, parameters: RawAppArgs): PluginMergeStrategy = {
protected def makeBootstrapMergeStrategy(lateLogger: IzLogger, parameters: RawAppArgs): PluginMergeStrategy = {
Quirks.discard(lateLogger, parameters)
SimplePluginMergeStrategy
}
Expand All @@ -124,15 +124,15 @@ protected def makeBootstrapMergeStrategy(lateLogger: IzLogger, parameters: RawAp
}

protected def makePlanner(options: ContextOptions, bsModule: BootstrapModule, activation: AppActivation, lateLogger: IzLogger): RoleAppPlanner[F] = {
new RoleAppPlannerImpl[F](options, bsModule, activation, lateLogger)
new RoleAppPlanner.Impl[F](options, bsModule, activation, lateLogger)
}

protected def makeExecutor(parameters: RawAppArgs, roles: RolesInfo, lateLogger: IzLogger, injector: Injector): RoleAppExecutor[F] = {
new RoleAppExecutorImpl[F](hook, roles, injector, lateLogger, parameters)
new RoleAppExecutor.Impl[F](hook, roles, injector, lateLogger, parameters)
}

protected def makeModuleProvider(options: ContextOptions, parameters: RawAppArgs, activation: AppActivation, roles: RolesInfo, config: AppConfig, lateLogger: IzLogger): ModuleProvider[F] = {
new ModuleProviderImpl[F](
protected def makeModuleProvider(options: ContextOptions, parameters: RawAppArgs, activation: AppActivation, roles: RolesInfo, config: AppConfig, lateLogger: IzLogger): ModuleProvider[F] = {
new ModuleProvider.Impl[F](
lateLogger,
config,
roles,
Expand All @@ -155,7 +155,7 @@ protected def makeModuleProvider(options: ContextOptions, parameters: RawAppArgs
protected def loadRoles(parameters: RawAppArgs, logger: IzLogger, plugins: AllLoadedPlugins): RolesInfo = {
val activeRoleNames = parameters.roles.map(_.role).toSet
val mp = MirrorProvider.Impl
val roleProvider: RoleProvider[F] = new RoleProviderImpl(logger, activeRoleNames, mp)
val roleProvider: RoleProvider[F] = new RoleProvider.Impl(logger, activeRoleNames, mp)
val bindings = plugins.app.flatMap(_.bindings)
val bsBindings = plugins.app.flatMap(_.bindings)
logger.info(s"Available ${plugins.app.size -> "app plugins"} with ${bindings.size -> "app bindings"} and ${plugins.bootstrap.size -> "bootstrap plugins"} with ${bsBindings.size -> "bootstrap bindings"} ...")
Expand Down Expand Up @@ -187,10 +187,12 @@ protected def makeModuleProvider(options: ContextOptions, parameters: RawAppArgs
logger.info(s"Available ${availableRoleInfo.niceList() -> "roles"}")
}

protected def showBanner(logger: IzLogger, referenceLibraries: Seq[LibraryReference]): this.type = {
protected def showBanner(logger: IzLogger, referenceLibraries: Seq[LibraryReference]): this.type = {
val withIzumi = referenceLibraries :+ LibraryReference("izumi-r2", classOf[ConfigLoader])
showDepData(logger, "Application is about to start", this.getClass)
withIzumi.foreach { u => showDepData(logger, s"... using ${u.libraryName}", u.clazz) }
withIzumi.foreach {
u => showDepData(logger, s"... using ${u.libraryName}", u.clazz)
}
this
}

Expand All @@ -212,7 +214,7 @@ protected def showBanner(logger: IzLogger, referenceLibraries: Seq[LibraryRefere
}

protected def makePluginLoader(bootstrapConfig: BootstrapConfig): PluginSource = {
new PluginSourceImpl(bootstrapConfig)
new PluginSource.Impl(bootstrapConfig)
}

protected def makeConfigLoader(logger: IzLogger, parameters: RawAppArgs): ConfigLoader = {
Expand All @@ -222,7 +224,7 @@ protected def showBanner(logger: IzLogger, referenceLibraries: Seq[LibraryRefere
r =>
r.role -> Options.configParam.findValue(r.roleParameters).asFile
}
new ConfigLoaderLocalFSImpl(logger, maybeGlobalConfig, roleConfigs.toMap)
new ConfigLoader.LocalFSImpl(logger, maybeGlobalConfig, roleConfigs.toMap)
}

}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package izumi.distage.roles.config

import izumi.distage.config.ConfigInjectionOptions
import izumi.distage.roles.services.ResourceRewriter.RewriteRules

case class ContextOptions(
addGvDump: Boolean,
warnOnCircularDeps: Boolean,
rewriteRules: RewriteRules,
configInjectionOptions: ConfigInjectionOptions,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,18 @@ package izumi.distage.roles.internal
import java.nio.charset.StandardCharsets
import java.nio.file.{Files, Paths}

import com.typesafe.config.{Config, ConfigFactory, ConfigRenderOptions}
import izumi.distage.config.model.AppConfig
import izumi.distage.config.{ConfigModule, ResolvedConfig}
import izumi.distage.model.definition.{Id, ModuleBase}
import izumi.distage.model.monadic.DIEffect
import izumi.distage.model.plan.ExecutableOp.WiringOp
import izumi.distage.model.plan.OrderedPlan
import izumi.distage.roles.config.ContextOptions
import izumi.distage.roles.internal.ConfigWriter.{ConfigurableComponent, WriteReference}
import izumi.distage.roles.model.meta.{RoleBinding, RolesInfo}
import izumi.distage.roles.model.{RoleDescriptor, RoleTask}
import izumi.distage.roles.services.ModuleProviderImpl.ContextOptions
import izumi.distage.roles.config.ContextOptions
import izumi.distage.roles.services.RoleAppPlanner
import izumi.fundamentals.platform.cli.model.raw.RawEntrypointParams
import izumi.fundamentals.platform.cli.model.schema.{ParserDef, RoleParserSchema}
Expand All @@ -21,7 +23,6 @@ import izumi.fundamentals.platform.resources.ArtifactVersion
import izumi.logstage.api.IzLogger
import izumi.logstage.api.logger.LogRouter
import izumi.logstage.distage.LogstageModule
import com.typesafe.config.{Config, ConfigFactory, ConfigRenderOptions}

import scala.util._

Expand All @@ -32,7 +33,7 @@ class ConfigWriter[F[_] : DIEffect]
roleInfo: RolesInfo,
context: RoleAppPlanner[F],
options: ContextOptions,
appModule: ModuleBase@Id("application.module")
appModule: ModuleBase@Id("application.module"),
)
extends RoleTask[F] {

Expand Down Expand Up @@ -211,10 +212,10 @@ object ConfigWriter extends RoleDescriptor {
final case class ConfigurableComponent(
componentId: String
, version: Option[ArtifactVersion]
, parent: Option[Config] = None
, parent: Option[Config] = None,
)

object P extends ParserDef {
object P extends ParserDef {
final val targetDir = arg("target", "t", "target directory", "<path>")
final val excludeCommon = flag("exclude-common", "ec", "do not include shared sections")
final val useComponentVersion = flag("version-use-component", "vc", "use component version instead of launcher version")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ class Help[F[_] : DIEffect]
(
roleInfo: RolesInfo,
activation: AppActivation,
)
extends RoleTask[F] {
) extends RoleTask[F] {

override def start(roleParameters: RawEntrypointParams, freeArgs: Vector[String]): F[Unit] = {
Quirks.discard(roleParameters, freeArgs)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ import izumi.logstage.sink.{ConsoleSink, QueueingSink}

import scala.util.{Failure, Success, Try}

class SimpleLoggerConfigurator(exceptionLogger: IzLogger) {
class SimpleLoggerConfigurator(
exceptionLogger: IzLogger,
) {

import SimpleLoggerConfigurator._

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package izumi.distage.roles.services

import distage.ModuleBase
import izumi.distage.model.definition.Axis.AxisValue
import izumi.distage.model.definition.{AxisBase, BindingTag}
import izumi.distage.roles.RoleAppLauncher.Options
import izumi.distage.roles.model.{AppActivation, DiAppBootstrapException}
import izumi.fundamentals.platform.cli.model.raw.RawAppArgs
import izumi.logstage.api.IzLogger
import distage.ModuleBase
import izumi.fundamentals.platform.strings.IzString._
import izumi.logstage.api.IzLogger

class ActivationParser {
def parseActivation(
Expand All @@ -20,12 +20,14 @@ class ActivationParser {
val uses = Options.use.findValues(parameters.globalParameters)
val availableUses: Map[AxisBase, Set[AxisValue]] = ActivationParser.findAvailableChoices(logger, defApp)

def options: String = availableUses
.map {
case (axis, members) =>
s"$axis:${members.niceList().shift(2)}"
}
.niceList()
def options: String = {
availableUses
.map {
case (axis, members) =>
s"$axis:${members.niceList().shift(2)}"
}
.niceList()
}

val activeChoices = uses
.map {
Expand Down Expand Up @@ -69,7 +71,9 @@ def options: String = availableUses

object ActivationParser {
def findAvailableChoices(logger: IzLogger, defApp: ModuleBase): Map[AxisBase, Set[AxisValue]] = {
val allChoices = defApp.bindings.flatMap(_.tags).collect({ case BindingTag.AxisTag(choice) => choice })
val allChoices = defApp.bindings.flatMap(_.tags).collect({
case BindingTag.AxisTag(choice) => choice
})
val allAxis = allChoices.map(_.axis).groupBy(_.name)
val badAxis = allAxis.filter(_._2.size > 1)
if (badAxis.nonEmpty) {
Expand Down
Loading