Various API changes

This commit is contained in:
Alexandre Archambault 2015-06-26 00:59:12 +01:00
parent 7a10915ccf
commit dc2e2278b0
9 changed files with 88 additions and 63 deletions

View File

@ -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

View File

@ -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]

View File

@ -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

View File

@ -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 -> _)
)
)
}
}

View File

@ -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
}

View File

@ -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 {
</profile>
"""
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 {
</profile>
"""
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 {
</profile>
"""
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")

View File

@ -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
}

View File

@ -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)
}
}

View File

@ -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