From dc2e2278b0bdb75d5ecc230a8726de0c38b51941 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Fri, 26 Jun 2015 00:59:12 +0100 Subject: [PATCH] Various API changes --- .../main/scala/coursier/cli/Coursier.scala | 5 +- .../main/scala/coursier/core/Repository.scala | 9 --- .../coursier/core/ResolutionProcess.scala | 20 +++++- core/src/main/scala/coursier/package.scala | 62 ++++++++----------- .../scala/coursier/test/CentralTests.scala | 5 +- .../scala/coursier/test/PomParsingTests.scala | 13 ++-- .../scala/coursier/test/ResolutionTests.scala | 5 +- .../test/scala/coursier/test/package.scala | 27 ++++++++ web/src/main/scala/coursier/web/Backend.scala | 5 +- 9 files changed, 88 insertions(+), 63 deletions(-) diff --git a/cli/src/main/scala/coursier/cli/Coursier.scala b/cli/src/main/scala/coursier/cli/Coursier.scala index 6f2d2e34c..6349cb792 100644 --- a/cli/src/main/scala/coursier/cli/Coursier.scala +++ b/cli/src/main/scala/coursier/cli/Coursier.scala @@ -97,7 +97,7 @@ case class Coursier(scope: List[String], filter = Some(dep => (keepOptional || !dep.optional) && scopes(dep.scope)) ) - val fetchQuiet = Repository.fetchSeveralFrom(repositories) + val fetchQuiet = coursier.fetch(repositories) val fetch0 = if (verbose0 == 0) fetchQuiet else { @@ -109,7 +109,8 @@ case class Coursier(scope: List[String], print.flatMap(_ => fetchQuiet(modVers)) } - val res = ResolutionProcess(startRes) + val res = startRes + .process .run(fetch0, maxIterations) .run diff --git a/core/src/main/scala/coursier/core/Repository.scala b/core/src/main/scala/coursier/core/Repository.scala index 088b96961..54a3d1745 100644 --- a/core/src/main/scala/coursier/core/Repository.scala +++ b/core/src/main/scala/coursier/core/Repository.scala @@ -62,15 +62,6 @@ object Repository { } } - def fetchFrom(repositories: Seq[Repository]): ModuleVersion => EitherT[Task, Seq[String], (Artifact.Source, Project)] = - modVersion => find(repositories, modVersion._1, modVersion._2) - - def fetchSeveralFrom(repositories: Seq[Repository]): Seq[ModuleVersion] => Task[Seq[(ModuleVersion, Seq[String] \/ (Artifact.Source, Project))]] = { - val fetchOne = fetchFrom(repositories) - modVers => - Task.gatherUnordered(modVers.map(modVer => fetchOne(modVer).run.map(modVer -> _))) - } - sealed trait CachePolicy { def apply[E,T](local: => Task[E \/ T]) (remote: => Task[E \/ T]): Task[E \/ T] diff --git a/core/src/main/scala/coursier/core/ResolutionProcess.scala b/core/src/main/scala/coursier/core/ResolutionProcess.scala index adb4c27f8..147ce0ad0 100644 --- a/core/src/main/scala/coursier/core/ResolutionProcess.scala +++ b/core/src/main/scala/coursier/core/ResolutionProcess.scala @@ -11,13 +11,27 @@ sealed trait ResolutionProcess { (implicit F: Monad[F]): F[Resolution] = { if (maxIterations == 0) F.point(current) - else + else { + val maxIterations0 = if (maxIterations > 0) maxIterations - 1 else maxIterations + this match { case Done(res) => F.point(res) case missing0 @ Missing(missing, _, _) => - F.bind(fetch(missing))(result => missing0.next(result).run(fetch, if (maxIterations > 0) maxIterations - 1 else maxIterations)) - case cont @ Continue(_, _) => cont.nextNoCont.run(fetch) + F.bind(fetch(missing))(result => missing0.next(result).run(fetch, maxIterations0)) + case cont @ Continue(_, _) => cont.nextNoCont.run(fetch, maxIterations0) } + } + } + + def next[F[_]](fetch: ResolutionProcess.Fetch[F]) + (implicit F: Monad[F]): F[ResolutionProcess] = { + + this match { + case Done(res) => F.point(this) + case missing0 @ Missing(missing, _, _) => + F.map(fetch(missing))(result => missing0.next(result)) + case cont @ Continue(_, _) => cont.nextNoCont.next(fetch) + } } def current: Resolution diff --git a/core/src/main/scala/coursier/package.scala b/core/src/main/scala/coursier/package.scala index 96ecf6c4c..b0caddc55 100644 --- a/core/src/main/scala/coursier/package.scala +++ b/core/src/main/scala/coursier/package.scala @@ -1,6 +1,7 @@ +import scalaz.concurrent.Task /** - * Pulls definitions from coursier.core, with default arguments. + * Pulls definitions from coursier.core, sometimes with default arguments. */ package object coursier { @@ -23,34 +24,10 @@ package object coursier { } type Project = core.Project - object Project { - def apply(module: Module, - version: String, - dependencies: Seq[Dependency] = Seq.empty, - parent: Option[ModuleVersion] = None, - dependencyManagement: Seq[Dependency] = Seq.empty, - properties: Map[String, String] = Map.empty, - profiles: Seq[Profile] = Seq.empty, - versions: Option[core.Versions] = None): Project = - core.Project(module, version, dependencies, parent, dependencyManagement, properties, profiles, versions) - } + val Project: core.Project.type = core.Project type Profile = core.Profile - object Profile { - type Activation = core.Activation - object Activation { - def apply(properties: Seq[(String, Option[String])] = Nil): Activation = - core.Activation(properties) - } - - def apply(id: String, - activeByDefault: Option[Boolean] = None, - activation: Activation = Activation(), - dependencies: Seq[Dependency] = Nil, - dependencyManagement: Seq[Dependency] = Nil, - properties: Map[String, String] = Map.empty) = - core.Profile(id, activeByDefault, activation, dependencies, dependencyManagement, properties) - } + val Profile: core.Profile.type = core.Profile type Module = core.Module object Module { @@ -63,6 +40,9 @@ package object coursier { type Scope = core.Scope val Scope: core.Scope.type = core.Scope + type Repository = core.Repository + val Repository: core.Repository.type = core.Repository + type Resolution = core.Resolution object Resolution { val empty = apply() @@ -72,20 +52,30 @@ package object coursier { projectCache: Map[ModuleVersion, (Artifact.Source, Project)] = Map.empty, errorCache: Map[ModuleVersion, Seq[String]] = Map.empty, filter: Option[Dependency => Boolean] = None, - profileActivation: Option[(String, Profile.Activation, Map[String, String]) => Boolean] = None): Resolution = + profileActivation: Option[(String, core.Activation, Map[String, String]) => Boolean] = None): Resolution = core.Resolution(rootDependencies, dependencies, conflicts, projectCache, errorCache, filter, profileActivation) } type Artifact = core.Artifact - object Artifact { - def apply(url: String, - extra: Map[String, String] = Map.empty, - attributes: Attributes = Attributes()): Artifact = - core.Artifact(url, extra, attributes) - - type Source = core.Artifact.Source - } + val Artifact: core.Artifact.type = core.Artifact type ResolutionProcess = core.ResolutionProcess val ResolutionProcess: core.ResolutionProcess.type = core.ResolutionProcess + + implicit class ResolutionExtensions(val underlying: Resolution) extends AnyVal { + def process: ResolutionProcess = ResolutionProcess(underlying) + } + + def fetch(repositories: Seq[core.Repository]): ResolutionProcess.Fetch[Task] = { + modVers => + Task.gatherUnordered( + modVers + .map(modVer => + Repository.find(repositories, modVer._1, modVer._2) + .run + .map(modVer -> _) + ) + ) + } + } diff --git a/core/src/test/scala/coursier/test/CentralTests.scala b/core/src/test/scala/coursier/test/CentralTests.scala index 0d2b98148..10e7cb5b4 100644 --- a/core/src/test/scala/coursier/test/CentralTests.scala +++ b/core/src/test/scala/coursier/test/CentralTests.scala @@ -16,8 +16,9 @@ object CentralTests extends TestSuite { def resolve(deps: Set[Dependency], filter: Option[Dependency => Boolean] = None, extraRepo: Option[Repository] = None) = { val repositories0 = extraRepo.toSeq ++ repositories - ResolutionProcess(Resolution(deps, filter = filter)) - .run(Repository.fetchSeveralFrom(repositories0)) + Resolution(deps, filter = filter) + .process + .run(fetch(repositories0)) .runF } diff --git a/core/src/test/scala/coursier/test/PomParsingTests.scala b/core/src/test/scala/coursier/test/PomParsingTests.scala index 3135c4905..ae56eab8a 100644 --- a/core/src/test/scala/coursier/test/PomParsingTests.scala +++ b/core/src/test/scala/coursier/test/PomParsingTests.scala @@ -5,7 +5,6 @@ import utest._ import scalaz._ import coursier.core.Xml -import coursier.Profile.Activation import coursier.core.compatibility._ object PomParsingTests extends TestSuite { @@ -34,7 +33,7 @@ object PomParsingTests extends TestSuite { """ - val expected = \/-(Profile("profile1", None, Activation(Nil), Nil, Nil, Map.empty)) + val expected = \/-(Profile("profile1", None, Profile.Activation(Nil), Nil, Nil, Map.empty)) val result = Xml.profile(xmlParse(profileNode).right.get) @@ -49,7 +48,7 @@ object PomParsingTests extends TestSuite { """ - val expected = \/-(Profile("", Some(true), Activation(Nil), Nil, Nil, Map.empty)) + val expected = \/-(Profile("", Some(true), Profile.Activation(Nil), Nil, Nil, Map.empty)) val result = Xml.profile(xmlParse(profileNode).right.get) @@ -65,7 +64,7 @@ object PomParsingTests extends TestSuite { """ - val expected = \/-(Profile("profile1", Some(true), Activation(Nil), Nil, Nil, Map.empty)) + val expected = \/-(Profile("profile1", Some(true), Profile.Activation(Nil), Nil, Nil, Map.empty)) val result = Xml.profile(xmlParse(profileNode).right.get) @@ -88,7 +87,7 @@ object PomParsingTests extends TestSuite { val expected = \/-(Profile( "profile1", None, - Activation(Nil), + Profile.Activation(Nil), Seq( Dependency(Module("comp", "lib"), "0.2")), Nil, @@ -119,7 +118,7 @@ object PomParsingTests extends TestSuite { val expected = \/-(Profile( "profile1", None, - Activation(Nil), + Profile.Activation(Nil), Nil, Seq( Dependency(Module("comp", "lib"), "0.2", scope = Scope.Test)), @@ -143,7 +142,7 @@ object PomParsingTests extends TestSuite { val expected = \/-(Profile( "profile1", None, - Activation(Nil), + Profile.Activation(Nil), Nil, Nil, Map("first.prop" -> "value1") diff --git a/core/src/test/scala/coursier/test/ResolutionTests.scala b/core/src/test/scala/coursier/test/ResolutionTests.scala index 66f7f20d1..c88266e18 100644 --- a/core/src/test/scala/coursier/test/ResolutionTests.scala +++ b/core/src/test/scala/coursier/test/ResolutionTests.scala @@ -10,8 +10,9 @@ import coursier.test.compatibility._ object ResolutionTests extends TestSuite { def resolve0(deps: Set[Dependency], filter: Option[Dependency => Boolean] = None) = { - ResolutionProcess(Resolution(deps, filter = filter)) - .run(Repository.fetchSeveralFrom(repositories)) + Resolution(deps, filter = filter) + .process + .run(fetch(repositories)) .runF } diff --git a/core/src/test/scala/coursier/test/package.scala b/core/src/test/scala/coursier/test/package.scala index 863eb2519..b2feafef9 100644 --- a/core/src/test/scala/coursier/test/package.scala +++ b/core/src/test/scala/coursier/test/package.scala @@ -6,4 +6,31 @@ package object test { def withCompileScope: Dependency = underlying.copy(scope = Scope.Compile) } + object Profile { + type Activation = core.Activation + object Activation { + def apply(properties: Seq[(String, Option[String])] = Nil): Activation = + core.Activation(properties) + } + + def apply(id: String, + activeByDefault: Option[Boolean] = None, + activation: Activation = Activation(), + dependencies: Seq[Dependency] = Nil, + dependencyManagement: Seq[Dependency] = Nil, + properties: Map[String, String] = Map.empty) = + core.Profile(id, activeByDefault, activation, dependencies, dependencyManagement, properties) + } + + object Project { + def apply(module: Module, + version: String, + dependencies: Seq[Dependency] = Seq.empty, + parent: Option[ModuleVersion] = None, + dependencyManagement: Seq[Dependency] = Seq.empty, + properties: Map[String, String] = Map.empty, + profiles: Seq[Profile] = Seq.empty, + versions: Option[core.Versions] = None): Project = + core.Project(module, version, dependencies, parent, dependencyManagement, properties, profiles, versions) + } } diff --git a/web/src/main/scala/coursier/web/Backend.scala b/web/src/main/scala/coursier/web/Backend.scala index 476bc9d98..4c8c87bf5 100644 --- a/web/src/main/scala/coursier/web/Backend.scala +++ b/web/src/main/scala/coursier/web/Backend.scala @@ -133,8 +133,9 @@ class Backend($: BackendScope[Unit, State]) { filter = Some(dep => (s.options.followOptional || !dep.optional) && (s.options.keepTest || dep.scope != Scope.Test)) ) - ResolutionProcess(res) - .run(Repository.fetchSeveralFrom(s.repositories.map(r => r.copy(fetch = r.fetch.copy(logger = Some(logger))))), 100) + res + .process + .run(fetch(s.repositories.map(r => r.copy(fetch = r.fetch.copy(logger = Some(logger))))), 100) } // For reasons that are unclear to me, not delaying this when using the runNow execution context