Skip to content

Commit

Permalink
Do not make BuildToolDispatcher a subclass of BuildTool
Browse files Browse the repository at this point in the history
This inheritance was an unnecessary complication since we don't pass
the dispatcher to code that expects a `BuildToolAlg`. This change allows
us to remove `BuildToolDispatcher#containsBuild` which was never used.
  • Loading branch information
fthomas committed Mar 13, 2021
1 parent b649182 commit f27fee9
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,7 @@ object Context {
implicit val mavenAlg: MavenAlg[F] = MavenAlg.create[F](config)
implicit val sbtAlg: SbtAlg[F] = SbtAlg.create[F](config)
implicit val millAlg: MillAlg[F] = MillAlg.create[F]
implicit val buildToolDispatcher: BuildToolDispatcher[F] =
BuildToolDispatcher.create[F](config)
implicit val buildToolDispatcher: BuildToolDispatcher[F] = new BuildToolDispatcher[F](config)
implicit val refreshErrorAlg: RefreshErrorAlg[F] = new RefreshErrorAlg[F](refreshErrorStore)
implicit val repoCacheAlg: RepoCacheAlg[F] = new RepoCacheAlg[F](config)
implicit val editAlg: EditAlg[F] = new EditAlg[F]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@ package org.scalasteward.core.buildtool

import org.scalasteward.core.data.Scope
import org.scalasteward.core.edit.scalafix.ScalafixMigration
import org.scalasteward.core.vcs.data.BuildRoot

trait BuildToolAlg[F[_], R] {
def containsBuild(r: R): F[Boolean]
trait BuildToolAlg[F[_]] {
def containsBuild(buildRoot: BuildRoot): F[Boolean]

def getDependencies(r: R): F[List[Scope.Dependencies]]
def getDependencies(buildRoot: BuildRoot): F[List[Scope.Dependencies]]

def runMigration(r: R, migration: ScalafixMigration): F[Unit]
def runMigration(buildRoot: BuildRoot, migration: ScalafixMigration): F[Unit]
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,69 +24,56 @@ import org.scalasteward.core.buildtool.mill.MillAlg
import org.scalasteward.core.buildtool.sbt.SbtAlg
import org.scalasteward.core.data.Scope
import org.scalasteward.core.edit.scalafix.ScalafixMigration
import org.scalasteward.core.scalafmt.ScalafmtAlg
import org.scalasteward.core.vcs.data.Repo
import org.scalasteward.core.repoconfig.RepoConfigAlg
import org.scalasteward.core.vcs.data.BuildRoot

trait BuildToolDispatcher[F[_]] extends BuildToolAlg[F, Repo]

object BuildToolDispatcher {
def create[F[_]](config: Config)(implicit
mavenAlg: MavenAlg[F],
millAlg: MillAlg[F],
sbtAlg: SbtAlg[F],
scalafmtAlg: ScalafmtAlg[F],
repoConfigAlg: RepoConfigAlg[F],
F: Monad[F]
): BuildToolDispatcher[F] = {
val allBuildTools = List(mavenAlg, millAlg, sbtAlg)
val fallbackBuildTool = sbtAlg

new BuildToolDispatcher[F] {
import org.scalasteward.core.scalafmt.ScalafmtAlg
import org.scalasteward.core.vcs.data.{BuildRoot, Repo}

private def buildRootsForRepo(repo: Repo): F[List[BuildRoot]] = for {
repoConfigOpt <- repoConfigAlg.readRepoConfig(repo)
repoConfig <- repoConfigAlg.mergeWithDefault(repoConfigOpt)
buildRoots = repoConfig.buildRootsOrDefault
.map(config => BuildRoot(repo, config.relativePath))
} yield buildRoots
final class BuildToolDispatcher[F[_]](config: Config)(implicit
mavenAlg: MavenAlg[F],
millAlg: MillAlg[F],
sbtAlg: SbtAlg[F],
scalafmtAlg: ScalafmtAlg[F],
repoConfigAlg: RepoConfigAlg[F],
F: Monad[F]
) {
private val allBuildTools = List(mavenAlg, millAlg, sbtAlg)
private val fallbackBuildTool = sbtAlg

override def containsBuild(repo: Repo): F[Boolean] =
buildRootsForRepo(repo).flatMap(buildRoots =>
buildRoots.existsM(buildRoot => allBuildTools.existsM(_.containsBuild(buildRoot)))
)
private def buildRootsForRepo(repo: Repo): F[List[BuildRoot]] = for {
repoConfigOpt <- repoConfigAlg.readRepoConfig(repo)
repoConfig <- repoConfigAlg.mergeWithDefault(repoConfigOpt)
buildRoots = repoConfig.buildRootsOrDefault
.map(config => BuildRoot(repo, config.relativePath))
} yield buildRoots

override def getDependencies(repo: Repo): F[List[Scope.Dependencies]] =
def getDependencies(repo: Repo): F[List[Scope.Dependencies]] =
for {
buildRoots <- buildRootsForRepo(repo)
result <- buildRoots.flatTraverse(buildRoot =>
for {
buildRoots <- buildRootsForRepo(repo)
result <- buildRoots.flatTraverse(buildRoot =>
for {
dependencies <- foundBuildTools(buildRoot).flatMap(
_.flatTraverse(_.getDependencies(buildRoot))
)
additionalDependencies <- getAdditionalDependencies(buildRoot)
} yield Scope.combineByResolvers(additionalDependencies ::: dependencies)
)
} yield result

override def runMigration(repo: Repo, migration: ScalafixMigration): F[Unit] =
buildRootsForRepo(repo).flatMap(buildRoots =>
buildRoots.traverse_(buildRoot =>
foundBuildTools(buildRoot).flatMap(_.traverse_(_.runMigration(buildRoot, migration)))
dependencies <- foundBuildTools(buildRoot).flatMap(
_.flatTraverse(_.getDependencies(buildRoot))
)
)
additionalDependencies <- getAdditionalDependencies(buildRoot)
} yield Scope.combineByResolvers(additionalDependencies ::: dependencies)
)
} yield result

private def foundBuildTools(buildRoot: BuildRoot): F[List[BuildToolAlg[F, BuildRoot]]] =
allBuildTools.filterA(_.containsBuild(buildRoot)).map {
case Nil => List(fallbackBuildTool)
case list => list
}
def runMigration(repo: Repo, migration: ScalafixMigration): F[Unit] =
buildRootsForRepo(repo).flatMap(buildRoots =>
buildRoots.traverse_(buildRoot =>
foundBuildTools(buildRoot).flatMap(_.traverse_(_.runMigration(buildRoot, migration)))
)
)

def getAdditionalDependencies(buildRoot: BuildRoot): F[List[Scope.Dependencies]] =
scalafmtAlg
.getScalafmtDependency(buildRoot)
.map(_.map(dep => Scope(List(dep), List(config.defaultResolver))).toList)
private def foundBuildTools(buildRoot: BuildRoot): F[List[BuildToolAlg[F]]] =
allBuildTools.filterA(_.containsBuild(buildRoot)).map {
case Nil => List(fallbackBuildTool)
case list => list
}
}

private def getAdditionalDependencies(buildRoot: BuildRoot): F[List[Scope.Dependencies]] =
scalafmtAlg
.getScalafmtDependency(buildRoot)
.map(_.map(dep => Scope(List(dep), List(config.defaultResolver))).toList)
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import org.scalasteward.core.edit.scalafix.ScalafixMigration
import org.scalasteward.core.util.Nel
import org.scalasteward.core.vcs.data.BuildRoot

trait MavenAlg[F[_]] extends BuildToolAlg[F, BuildRoot]
trait MavenAlg[F[_]] extends BuildToolAlg[F]

object MavenAlg {
def create[F[_]](config: Config)(implicit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import org.scalasteward.core.edit.scalafix.ScalafixMigration
import org.scalasteward.core.util.Nel
import org.scalasteward.core.vcs.data.BuildRoot

trait MillAlg[F[_]] extends BuildToolAlg[F, BuildRoot]
trait MillAlg[F[_]] extends BuildToolAlg[F]

object MillAlg {
private val content =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import org.scalasteward.core.edit.scalafix.ScalafixMigration
import org.scalasteward.core.util.Nel
import org.scalasteward.core.vcs.data.BuildRoot

trait SbtAlg[F[_]] extends BuildToolAlg[F, BuildRoot] {
trait SbtAlg[F[_]] extends BuildToolAlg[F] {
def addGlobalPluginTemporarily[A](plugin: FileData)(fa: F[A]): F[A]

def addGlobalPlugins[A](fa: F[A]): F[A]
Expand Down

0 comments on commit f27fee9

Please sign in to comment.