Skip to content

Commit

Permalink
Sbt parsing logic moved from SbtShowCommand to another trait
Browse files Browse the repository at this point in the history
  • Loading branch information
d10xa committed Mar 4, 2021
1 parent 20bd2d5 commit 279430a
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 66 deletions.
@@ -0,0 +1,65 @@
package ru.d10xa.jadd.code.scalameta

import cats.Applicative
import coursier.core.Version
import ru.d10xa.jadd.core.Artifact
import ru.d10xa.jadd.core.Scope
import ru.d10xa.jadd.core.types.GroupId
import ru.d10xa.jadd.core.types.ScalaVersion

import scala.meta.Source
import scala.meta.Term
import cats.syntax.all._

trait SbtArtifactsParser[F[_]] {
def parse(
scalaVersion: ScalaVersion,
sources: Vector[Source]
): F[Vector[Artifact]]
}

object SbtArtifactsParser {
def make[F[_]: Applicative](
sbtModuleIdFinder: SbtModuleIdFinder,
sbtStringValFinder: SbtStringValFinder
): F[SbtArtifactsParser[F]] = {
def parsePure(
scalaVersion: ScalaVersion,
sources: Vector[Source]
): Vector[Artifact] = {
val moduleIds: Vector[ModuleId] =
sources.flatMap(sbtModuleIdFinder.find).distinct
val stringValsMap: Map[String, String] = sources
.flatMap(sbtStringValFinder.find)
.map { case StringVal(name, value) => name -> value }
.toMap
moduleIds.map(m =>
Artifact(
groupId = GroupId(m.groupId),
artifactId = if (m.percentsCount > 1) {
s"${m.artifactId}%%"
} else m.artifactId,
maybeVersion = m.version match {
case VersionString(v) => Version(v).some
case VersionVal(v) => stringValsMap.get(v).map(Version(_))
},
maybeScalaVersion = if (m.percentsCount > 1) {
scalaVersion.some
} else None,
scope = m.terms
.find {
case Term.Name("Test") => true
case _ => false
}
.map(_ => Scope.Test)
)
)
}
new SbtArtifactsParser[F] {
override def parse(
scalaVersion: ScalaVersion,
sources: Vector[Source]
): F[Vector[Artifact]] = parsePure(scalaVersion, sources).pure[F]
}.pure[F]
}
}
59 changes: 35 additions & 24 deletions src/main/scala/ru/d10xa/jadd/run/CommandExecutor.scala
Expand Up @@ -7,6 +7,7 @@ import ru.d10xa.jadd.buildtools.BuildToolLayout
import ru.d10xa.jadd.buildtools.BuildToolLayoutSelector
import ru.d10xa.jadd.cli.Command.Help
import ru.d10xa.jadd.cli.Command.Repl
import ru.d10xa.jadd.code.scalameta.SbtArtifactsParser
import ru.d10xa.jadd.code.scalameta.SbtModuleIdFinder
import ru.d10xa.jadd.code.scalameta.SbtStringValFinder
import ru.d10xa.jadd.core.Ctx
Expand Down Expand Up @@ -51,38 +52,48 @@ class CommandExecutorImpl[F[_]: Sync] private (
executePipelines(ctx, loader, fileOps, artifactShortcuts)
}

private def executePipelines(
def layoutToPipeline(
layout: BuildToolLayout,
ctx: Ctx,
loader: Loader[F],
fileOps: FileOps[F],
artifactShortcuts: ArtifactShortcuts
)(implicit logger: Logger[F]): F[Unit] = {

val pipeline: F[Pipeline[F]] = for {
layout <- buildToolLayoutSelector.select(ctx)
} yield layout match {
fileOps: FileOps[F]
): F[Pipeline[F]] =
layout match {
case BuildToolLayout.Gradle =>
new GradlePipeline(ctx, fileOps)
Sync[F].delay(new GradlePipeline(ctx, fileOps))
case BuildToolLayout.Maven =>
new MavenPipeline(ctx, fileOps)
Sync[F].delay(new MavenPipeline(ctx, fileOps))
case BuildToolLayout.Sbt =>
val scalaVersionFinder = LiveSbtScalaVersionFinder.make(ctx, fileOps)
new SbtPipeline(
ctx,
scalaVersionFinder,
new SbtShowCommand(
fileOps,
for {
sbtArtifactsParser <- SbtArtifactsParser
.make[F](SbtModuleIdFinder, SbtStringValFinder)
scalaVersionFinder = LiveSbtScalaVersionFinder.make(ctx, fileOps)
sbtPipeline = new SbtPipeline(
ctx,
scalaVersionFinder,
SbtModuleIdFinder,
SbtStringValFinder
),
fileOps
)
new SbtShowCommand(
fileOps,
scalaVersionFinder,
sbtArtifactsParser
),
fileOps
)
} yield sbtPipeline
case BuildToolLayout.Ammonite =>
new AmmonitePipeline(ctx, fileOps)
Sync[F].delay(new AmmonitePipeline(ctx, fileOps))
case BuildToolLayout.Unknown =>
new UnknownProjectPipeline(ctx)
Sync[F].delay(new UnknownProjectPipeline(ctx))
}

private def executePipelines(
ctx: Ctx,
loader: Loader[F],
fileOps: FileOps[F],
artifactShortcuts: ArtifactShortcuts
)(implicit logger: Logger[F]): F[Unit] = {
val pipeline: F[Pipeline[F]] = for {
layout <- buildToolLayoutSelector.select(ctx)
p <- layoutToPipeline(layout, ctx, fileOps)
} yield p
val versionTools = VersionTools.make[F](coursierVersions)
pipeline.flatMap(_.run(loader, versionTools, artifactShortcuts))
}
Expand Down
44 changes: 4 additions & 40 deletions src/main/scala/ru/d10xa/jadd/show/SbtShowCommand.scala
Expand Up @@ -2,19 +2,12 @@ package ru.d10xa.jadd.show

import java.nio.file.Path
import java.nio.file.Paths

import cats.syntax.all._
import cats.data.Chain
import cats.effect.Sync
import coursier.core.Version
import ru.d10xa.jadd.code.scalameta.SbtModuleIdFinder
import ru.d10xa.jadd.code.scalameta.SbtStringValFinder
import ru.d10xa.jadd.code.scalameta.StringVal
import ru.d10xa.jadd.code.scalameta.VersionString
import ru.d10xa.jadd.code.scalameta.VersionVal
import ru.d10xa.jadd.code.scalameta.SbtArtifactsParser
import ru.d10xa.jadd.core.Artifact
import ru.d10xa.jadd.core.ScalaVersionFinder
import ru.d10xa.jadd.core.Scope
import ru.d10xa.jadd.core.types._
import ru.d10xa.jadd.fs.FileOps
import ru.d10xa.jadd.fs.FsItem.Dir
Expand All @@ -23,15 +16,13 @@ import ru.d10xa.jadd.versions.ScalaVersions
import ru.d10xa.jadd.instances._

import scala.meta.Source
import scala.meta.Term
import scala.meta.dialects
import scala.meta.parsers.Parsed

class SbtShowCommand[F[_]: Sync](
fileOps: FileOps[F],
scalaVersionFinder: ScalaVersionFinder[F],
sbtModuleIdFinder: SbtModuleIdFinder,
sbtStringValFinder: SbtStringValFinder
sbtArtifactsParser: SbtArtifactsParser[F]
) {

def show(): F[Chain[Artifact]] =
Expand Down Expand Up @@ -79,35 +70,8 @@ class SbtShowCommand[F[_]: Sync](
dialects.Sbt1(str).parse[Source].toEither
}
.collect { case Right(value) => value }
moduleIds = parsedSources.flatMap(sbtModuleIdFinder.find).distinct
stringValsMap = parsedSources
.flatMap(sbtStringValFinder.find)
.map { case StringVal(name, value) => name -> value }
.toMap
c = Chain.fromSeq(
moduleIds.map(m =>
Artifact(
groupId = GroupId(m.groupId),
artifactId = if (m.percentsCount > 1) {
s"${m.artifactId}%%"
} else m.artifactId,
maybeVersion = m.version match {
case VersionString(v) => Version(v).some
case VersionVal(v) => stringValsMap.get(v).map(Version(_))
},
maybeScalaVersion = if (m.percentsCount > 1) {
scalaVersion.some
} else None,
scope = m.terms
.find {
case Term.Name("Test") => true
case _ => false
}
.map(_ => Scope.Test)
)
)
)
} yield c
c <- sbtArtifactsParser.parse(scalaVersion, parsedSources.toVector)
} yield Chain.fromSeq(c)

}
}
9 changes: 7 additions & 2 deletions src/test/scala/ru/d10xa/jadd/show/SbtShowCommandTest.scala
Expand Up @@ -2,6 +2,7 @@ package ru.d10xa.jadd.show

import cats.effect.SyncIO
import ru.d10xa.jadd.cli.Config
import ru.d10xa.jadd.code.scalameta.SbtArtifactsParser
import ru.d10xa.jadd.code.scalameta.SbtModuleIdFinder
import ru.d10xa.jadd.code.scalameta.SbtStringValFinder
import ru.d10xa.jadd.core.Artifact
Expand All @@ -12,6 +13,11 @@ import ru.d10xa.jadd.testkit.TestBase

class SbtShowCommandTest extends TestBase {

private val sbtArtifactsParser: SbtArtifactsParser[SyncIO] =
SbtArtifactsParser
.make[SyncIO](SbtModuleIdFinder, SbtStringValFinder)
.unsafeRunSync()

def showArtifacts(files: (String, String)*): List[Artifact] =
createFileOpsWithFilesF[SyncIO](files.toList)
.use { case (_, fileOps) =>
Expand All @@ -21,8 +27,7 @@ class SbtShowCommandTest extends TestBase {
new SbtShowCommand[SyncIO](
fileOps,
scalaVersions,
SbtModuleIdFinder,
SbtStringValFinder
sbtArtifactsParser
)
.show()
.map(_.toList)
Expand Down

0 comments on commit 279430a

Please sign in to comment.