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)) filter = Some(dep => (keepOptional || !dep.optional) && scopes(dep.scope))
) )
val fetchQuiet = Repository.fetchSeveralFrom(repositories) val fetchQuiet = coursier.fetch(repositories)
val fetch0 = val fetch0 =
if (verbose0 == 0) fetchQuiet if (verbose0 == 0) fetchQuiet
else { else {
@ -109,7 +109,8 @@ case class Coursier(scope: List[String],
print.flatMap(_ => fetchQuiet(modVers)) print.flatMap(_ => fetchQuiet(modVers))
} }
val res = ResolutionProcess(startRes) val res = startRes
.process
.run(fetch0, maxIterations) .run(fetch0, maxIterations)
.run .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 { sealed trait CachePolicy {
def apply[E,T](local: => Task[E \/ T]) def apply[E,T](local: => Task[E \/ T])
(remote: => Task[E \/ T]): 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] = { (implicit F: Monad[F]): F[Resolution] = {
if (maxIterations == 0) F.point(current) if (maxIterations == 0) F.point(current)
else else {
val maxIterations0 = if (maxIterations > 0) maxIterations - 1 else maxIterations
this match { this match {
case Done(res) => F.point(res) case Done(res) => F.point(res)
case missing0 @ Missing(missing, _, _) => case missing0 @ Missing(missing, _, _) =>
F.bind(fetch(missing))(result => missing0.next(result).run(fetch, if (maxIterations > 0) maxIterations - 1 else maxIterations)) F.bind(fetch(missing))(result => missing0.next(result).run(fetch, maxIterations0))
case cont @ Continue(_, _) => cont.nextNoCont.run(fetch) 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 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 { package object coursier {
@ -23,34 +24,10 @@ package object coursier {
} }
type Project = core.Project type Project = core.Project
object Project { val Project: core.Project.type = core.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)
}
type Profile = core.Profile type Profile = core.Profile
object Profile { val Profile: core.Profile.type = core.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)
}
type Module = core.Module type Module = core.Module
object Module { object Module {
@ -63,6 +40,9 @@ package object coursier {
type Scope = core.Scope type Scope = core.Scope
val Scope: core.Scope.type = core.Scope val Scope: core.Scope.type = core.Scope
type Repository = core.Repository
val Repository: core.Repository.type = core.Repository
type Resolution = core.Resolution type Resolution = core.Resolution
object Resolution { object Resolution {
val empty = apply() val empty = apply()
@ -72,20 +52,30 @@ package object coursier {
projectCache: Map[ModuleVersion, (Artifact.Source, Project)] = Map.empty, projectCache: Map[ModuleVersion, (Artifact.Source, Project)] = Map.empty,
errorCache: Map[ModuleVersion, Seq[String]] = Map.empty, errorCache: Map[ModuleVersion, Seq[String]] = Map.empty,
filter: Option[Dependency => Boolean] = None, 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) core.Resolution(rootDependencies, dependencies, conflicts, projectCache, errorCache, filter, profileActivation)
} }
type Artifact = core.Artifact type Artifact = core.Artifact
object Artifact { val Artifact: core.Artifact.type = core.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
}
type ResolutionProcess = core.ResolutionProcess type ResolutionProcess = core.ResolutionProcess
val ResolutionProcess: core.ResolutionProcess.type = 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) = { def resolve(deps: Set[Dependency], filter: Option[Dependency => Boolean] = None, extraRepo: Option[Repository] = None) = {
val repositories0 = extraRepo.toSeq ++ repositories val repositories0 = extraRepo.toSeq ++ repositories
ResolutionProcess(Resolution(deps, filter = filter)) Resolution(deps, filter = filter)
.run(Repository.fetchSeveralFrom(repositories0)) .process
.run(fetch(repositories0))
.runF .runF
} }

View File

@ -5,7 +5,6 @@ import utest._
import scalaz._ import scalaz._
import coursier.core.Xml import coursier.core.Xml
import coursier.Profile.Activation
import coursier.core.compatibility._ import coursier.core.compatibility._
object PomParsingTests extends TestSuite { object PomParsingTests extends TestSuite {
@ -34,7 +33,7 @@ object PomParsingTests extends TestSuite {
</profile> </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) val result = Xml.profile(xmlParse(profileNode).right.get)
@ -49,7 +48,7 @@ object PomParsingTests extends TestSuite {
</profile> </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) val result = Xml.profile(xmlParse(profileNode).right.get)
@ -65,7 +64,7 @@ object PomParsingTests extends TestSuite {
</profile> </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) val result = Xml.profile(xmlParse(profileNode).right.get)
@ -88,7 +87,7 @@ object PomParsingTests extends TestSuite {
val expected = \/-(Profile( val expected = \/-(Profile(
"profile1", "profile1",
None, None,
Activation(Nil), Profile.Activation(Nil),
Seq( Seq(
Dependency(Module("comp", "lib"), "0.2")), Dependency(Module("comp", "lib"), "0.2")),
Nil, Nil,
@ -119,7 +118,7 @@ object PomParsingTests extends TestSuite {
val expected = \/-(Profile( val expected = \/-(Profile(
"profile1", "profile1",
None, None,
Activation(Nil), Profile.Activation(Nil),
Nil, Nil,
Seq( Seq(
Dependency(Module("comp", "lib"), "0.2", scope = Scope.Test)), Dependency(Module("comp", "lib"), "0.2", scope = Scope.Test)),
@ -143,7 +142,7 @@ object PomParsingTests extends TestSuite {
val expected = \/-(Profile( val expected = \/-(Profile(
"profile1", "profile1",
None, None,
Activation(Nil), Profile.Activation(Nil),
Nil, Nil,
Nil, Nil,
Map("first.prop" -> "value1") Map("first.prop" -> "value1")

View File

@ -10,8 +10,9 @@ import coursier.test.compatibility._
object ResolutionTests extends TestSuite { object ResolutionTests extends TestSuite {
def resolve0(deps: Set[Dependency], filter: Option[Dependency => Boolean] = None) = { def resolve0(deps: Set[Dependency], filter: Option[Dependency => Boolean] = None) = {
ResolutionProcess(Resolution(deps, filter = filter)) Resolution(deps, filter = filter)
.run(Repository.fetchSeveralFrom(repositories)) .process
.run(fetch(repositories))
.runF .runF
} }

View File

@ -6,4 +6,31 @@ package object test {
def withCompileScope: Dependency = underlying.copy(scope = Scope.Compile) 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)) filter = Some(dep => (s.options.followOptional || !dep.optional) && (s.options.keepTest || dep.scope != Scope.Test))
) )
ResolutionProcess(res) res
.run(Repository.fetchSeveralFrom(s.repositories.map(r => r.copy(fetch = r.fetch.copy(logger = Some(logger))))), 100) .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 // For reasons that are unclear to me, not delaying this when using the runNow execution context