Skip to content

Commit

Permalink
Close #95 - Maven2Sbt should return modeled data instead of String
Browse files Browse the repository at this point in the history
  • Loading branch information
kevin-lee committed Mar 14, 2020
1 parent 9cd6f21 commit 010e40f
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 37 deletions.
10 changes: 6 additions & 4 deletions cli/src/main/scala/maven2sbt/cli/Maven2SbtApp.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import cats.data._
import cats.implicits._
import cats.effect._

import maven2sbt.core.{Maven2Sbt, Maven2SbtError}
import maven2sbt.core.{BuildSbt, Maven2Sbt, Maven2SbtError}
import maven2sbt.effect._

import pirate._
Expand All @@ -19,7 +19,7 @@ import piratex._
*/
object Maven2SbtApp extends MainIo[Maven2SbtArgs] {

val maven2SbtIo = Maven2Sbt[IO]
val maven2SbtIo: Maven2Sbt[IO] = Maven2Sbt[IO]

val cmd: Command[Maven2SbtArgs] =
Metavar.rewriteCommand(
Expand All @@ -46,7 +46,8 @@ object Maven2SbtApp extends MainIo[Maven2SbtArgs] {
.bracket { writer =>
(for {
buildSbt <- EitherT(maven2SbtIo.buildSbtFromPomFile(scalaVersion, pom))
_ <- EitherT(IO(writer.write(buildSbt)) *> IO(().asRight[Maven2SbtError]))
buildSbtString <- EitherT.liftF(IO(BuildSbt.render(buildSbt)))
_ <- EitherT(IO(writer.write(buildSbtString)) *> IO(().asRight[Maven2SbtError]))
_ <- EitherT(ConsoleEffect[IO].putStrLn(
s"""Success] The sbt config file has been successfully written at
| $buildSbtPath
Expand All @@ -61,7 +62,8 @@ object Maven2SbtApp extends MainIo[Maven2SbtArgs] {
(for {
pom <- EitherT(IO(toCanonicalFile(pomPath).asRight))
buildSbt <- EitherT(maven2SbtIo.buildSbtFromPomFile(scalaVersion, pom))
_ <- EitherT(ConsoleEffect[IO].putStrLn(buildSbt) *> IO(().asRight[Maven2SbtError]))
buildSbtString <- EitherT.liftF(IO(BuildSbt.render(buildSbt)))
_ <- EitherT(ConsoleEffect[IO].putStrLn(buildSbtString) *> IO(().asRight[Maven2SbtError]))
} yield ()).value
}

Expand Down
16 changes: 10 additions & 6 deletions core/src/main/scala/maven2sbt/core/BuildSbt.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import just.fp.{Named, Render}
* @since 2020-01-29
*/
final case class BuildSbt(
thisBuildSettings: ThisBuildSettings
globalSettings: GlobalSettings
, thisBuildSettings: ThisBuildSettings
, projectSettings: ProjectSettings
, globalSettings: GlobalSettings
, props: List[Prop]
)

Expand Down Expand Up @@ -41,9 +41,9 @@ object BuildSbt {
Render[A].render(a)
)
.mkString(
s"${prefix.getOrElse("")}${Named[A].name} ++= List("
s"${prefix.getOrElse("")}${Named[A].name} ++= List(\n "
, ",\n "
, " )"
, "\n )"
).some
}

Expand Down Expand Up @@ -82,15 +82,19 @@ object BuildSbt {
final case class PropValue(propValue: String) extends AnyVal

object Prop {

def fromMavenProperty(mavenProperty: MavenProperty): Prop =
Prop(PropName(mavenProperty.key), PropValue(mavenProperty.value))

def render(prop: Prop): String =
s"""val ${Common.dotSeparatedToCamelCase(prop.name.propName)} = "${prop.value.propValue}""""
}

def render(buildSbt: BuildSbt): String = buildSbt match {
case BuildSbt(
thisBuildSettings
globalSettings
, thisBuildSettings
, projectSettings
, globalSettings
, props
) =>

Expand Down
65 changes: 38 additions & 27 deletions core/src/main/scala/maven2sbt/core/Maven2Sbt.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ import scala.xml._
* @since 2017-04-03
*/
trait Maven2Sbt[F[_]] {
def buildSbt(scalaVersion: ScalaVersion, pom: => Elem): F[Either[Maven2SbtError, String]]
def buildSbtFromPomFile(scalaVersion: ScalaVersion, file: File): F[Either[Maven2SbtError, String]]
def buildSbtFromInputStream(scalaVersion: ScalaVersion, pom: InputStream): F[Either[Maven2SbtError, String]]
def buildSbt(scalaVersion: ScalaVersion, pom: => Elem): F[Either[Maven2SbtError, BuildSbt]]
def buildSbtFromPomFile(scalaVersion: ScalaVersion, file: File): F[Either[Maven2SbtError, BuildSbt]]
def buildSbtFromInputStream(scalaVersion: ScalaVersion, pom: InputStream): F[Either[Maven2SbtError, BuildSbt]]
}

object Maven2Sbt {
Expand All @@ -34,41 +34,52 @@ object Maven2Sbt {

def eitherTF[A, B](e: => Either[A, B]): EitherT[F, A, B] = EitherT(effect(e))

def buildSbt(scalaVersion: ScalaVersion, pomElem: => Elem): F[Either[Maven2SbtError, String]] =
def buildSbt(scalaVersion: ScalaVersion, pomElem: => Elem): F[Either[Maven2SbtError, BuildSbt]] =
for {
pom <- effect(pomElem)
ProjectInfo(GroupId(groupId), ArtifactId(artifactId), Version(version)) <- effect(ProjectInfo.from(pom))
ProjectInfo(groupId, artifactId, version) <- effect(ProjectInfo.from(pom))
mavenProperties <- effect(MavenProperty.from(pom))
props <- effect(mavenProperties.map(BuildSbt.Prop.fromMavenProperty))
repositories <- effect(Repository.from(pom))
dependencies <- effect(Dependency.from(pom))
renderedMavenProperties <- effect(mavenProperties.map(MavenProperty.render).mkString("\n"))
renderedRepositories <- effect(Repository.renderToResolvers(repositories, 4))
renderedDependencies <- effect(Dependency.renderLibraryDependencies(dependencies, 4))
buildSbtString <- effect(
s"""
|$renderedMavenProperties
|
|ThisBuild / organization := "$groupId"
|ThisBuild / version := "$version"
|ThisBuild / scalaVersion := "${scalaVersion.scalaVersion}"
|
|lazy val root = (project in file("."))
| .settings(
| name := "$artifactId"
| , $renderedRepositories
| , $renderedDependencies
| )
|""".stripMargin)
} yield buildSbtString.asRight

def buildSbtFromPomFile(scalaVersion: ScalaVersion, file: File): F[Either[Maven2SbtError, String]] =
buildSbtData <- effect(
BuildSbt(
BuildSbt.GlobalSettings(BuildSbt.Settings(
none[GroupId]
, none[ArtifactId]
, none[Version]
, none[ScalaVersion]
, List.empty[Repository]
, List.empty[Dependency]
))
, BuildSbt.ThisBuildSettings(BuildSbt.Settings(
groupId.some
, none[ArtifactId]
, version.some
, scalaVersion.some
, List.empty[Repository]
, List.empty[Dependency]
))
, BuildSbt.ProjectSettings(BuildSbt.Settings(
none[GroupId]
, artifactId.some
, none[Version]
, none[ScalaVersion]
, repositories.toList
, dependencies.toList
))
, props.toList
))
} yield buildSbtData.asRight

def buildSbtFromPomFile(scalaVersion: ScalaVersion, file: File): F[Either[Maven2SbtError, BuildSbt]] =
(for {
pomFile <- eitherTF(Option(file).filter(_.exists()).toRight(Maven2SbtError.pomFileNotExist(file)))
pomElem <- eitherTF(XML.loadFile(pomFile).asRight[Maven2SbtError])
buildSbtString <- EitherT(buildSbt(scalaVersion, pomElem))
} yield buildSbtString).value

def buildSbtFromInputStream(scalaVersion: ScalaVersion, pom: InputStream): F[Either[Maven2SbtError, String]] =
def buildSbtFromInputStream(scalaVersion: ScalaVersion, pom: InputStream): F[Either[Maven2SbtError, BuildSbt]] =
(for {
inputStream <- eitherTF(Option(pom).toRight(Maven2SbtError.noPomInputStream))
pomElem <- eitherTF(XML.load(inputStream).asRight[Maven2SbtError])
Expand Down

0 comments on commit 010e40f

Please sign in to comment.