From 7844190964d285cd8ae679d3ec2d9398a6d36211 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 12 Jul 2017 07:42:30 -0400 Subject: [PATCH] Use delegation instead of inheritance --- .../librarymanagement/LibraryManagement.scala | 37 ++++++++++++--- .../LibraryManagementInterface.scala | 2 +- .../sbt/librarymanagement/Publisher.scala | 47 +++++++++++++++++++ .../ivy/IvyLibraryManagement.scala | 4 +- .../librarymanagement/ivy/IvyPublisher.scala | 4 +- 5 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 core/src/main/scala/sbt/librarymanagement/Publisher.scala diff --git a/core/src/main/scala/sbt/librarymanagement/LibraryManagement.scala b/core/src/main/scala/sbt/librarymanagement/LibraryManagement.scala index 82401ec4b..54a3fa970 100644 --- a/core/src/main/scala/sbt/librarymanagement/LibraryManagement.scala +++ b/core/src/main/scala/sbt/librarymanagement/LibraryManagement.scala @@ -6,12 +6,21 @@ import sbt.io.Hash import sbt.librarymanagement.syntax._ /** - * Helper mixin to provide methods for library management + * Library management API to resolve dependencies. */ -abstract class LibraryManagement extends LibraryManagementInterface { +class LibraryManagement private[sbt] (lmEngine: LibraryManagementInterface) { import sbt.internal.librarymanagement.InternalDefaults._ import sbt.internal.librarymanagement.UpdateClassifiersUtil._ + /** + * Builds a ModuleDescriptor that describes a subproject with dependencies. + * + * @param moduleSetting It contains the information about the module including the dependencies. + * @return A `ModuleDescriptor` describing a subproject and its dependencies. + */ + def moduleDescriptor(moduleSetting: ModuleDescriptorConfiguration): ModuleDescriptor = + lmEngine.moduleDescriptor(moduleSetting) + /** * Build a ModuleDescriptor that describes a subproject with dependencies. * @@ -30,6 +39,22 @@ abstract class LibraryManagement extends LibraryManagementInterface { moduleDescriptor(moduleSetting) } + /** + * Resolves the given module's dependencies performing a retrieval. + * + * @param module The module to be resolved. + * @param configuration The update configuration. + * @param uwconfig The configuration to handle unresolved warnings. + * @param log The logger. + * @return The result, either an unresolved warning or an update report. Note that this + * update report will or will not be successful depending on the `missingOk` option. + */ + def update(module: ModuleDescriptor, + configuration: UpdateConfiguration, + uwconfig: UnresolvedWarningConfiguration, + log: Logger): Either[UnresolvedWarning, UpdateReport] = + lmEngine.update(module, configuration, uwconfig, log) + /** * Returns a `ModuleDescriptor` that depends on `dependencyId`. * @@ -192,7 +217,7 @@ abstract class LibraryManagement extends LibraryManagementInterface { }).mkString(", ") } -/** - * Helper mixin to provide methods for publisher - */ -abstract class Publisher extends PublisherInterface +object LibraryManagement { + def apply(lmEngine: LibraryManagementInterface): LibraryManagement = + new LibraryManagement(lmEngine) +} diff --git a/core/src/main/scala/sbt/librarymanagement/LibraryManagementInterface.scala b/core/src/main/scala/sbt/librarymanagement/LibraryManagementInterface.scala index 6650376b8..9af54bd06 100644 --- a/core/src/main/scala/sbt/librarymanagement/LibraryManagementInterface.scala +++ b/core/src/main/scala/sbt/librarymanagement/LibraryManagementInterface.scala @@ -4,7 +4,7 @@ import java.io.File import sbt.util.Logger /** - * Interface for library management + * Interface for library management intended for library management engine authors. */ abstract class LibraryManagementInterface { diff --git a/core/src/main/scala/sbt/librarymanagement/Publisher.scala b/core/src/main/scala/sbt/librarymanagement/Publisher.scala new file mode 100644 index 000000000..da3e09e6f --- /dev/null +++ b/core/src/main/scala/sbt/librarymanagement/Publisher.scala @@ -0,0 +1,47 @@ +package sbt.librarymanagement + +import java.io.File +import sbt.util.Logger + +/** + * Library management API to publish artifacts. + */ +class Publisher private[sbt] (publisherEngine: PublisherInterface) { + + /** + * Builds a ModuleDescriptor that describes a subproject with dependencies. + * + * @param moduleSetting It contains the information about the module including the dependencies. + * @return A `ModuleDescriptor` describing a subproject and its dependencies. + */ + def moduleDescriptor(moduleSetting: ModuleDescriptorConfiguration): ModuleDescriptor = + publisherEngine.moduleDescriptor(moduleSetting) + + /** + * Publishes the given module. + * + * @param module The module to be published. + * @param configuration The publish configuration. + * @param log The logger. + */ + def publish(module: ModuleDescriptor, configuration: PublishConfiguration, log: Logger): Unit = + publisherEngine.publish(module, configuration, log) + + /** + * Makes the `pom.xml` file for the given module. + * + * @param module The module for which a `.pom` file is to be created. + * @param configuration The makePomFile configuration. + * @param log The logger. + * @return The `File` containing the POM descriptor. + */ + def makePomFile(module: ModuleDescriptor, + configuration: MakePomConfiguration, + log: Logger): File = + publisherEngine.makePomFile(module, configuration, log) +} + +object Publisher { + def apply(publisherEngine: PublisherInterface): Publisher = + new Publisher(publisherEngine) +} diff --git a/ivy/src/main/scala/sbt/librarymanagement/ivy/IvyLibraryManagement.scala b/ivy/src/main/scala/sbt/librarymanagement/ivy/IvyLibraryManagement.scala index 5eee63a45..3d591ea02 100644 --- a/ivy/src/main/scala/sbt/librarymanagement/ivy/IvyLibraryManagement.scala +++ b/ivy/src/main/scala/sbt/librarymanagement/ivy/IvyLibraryManagement.scala @@ -5,7 +5,7 @@ package ivy import sbt.internal.librarymanagement._ import sbt.util.Logger -class IvyLibraryManagement private[sbt] (val ivySbt: IvySbt) extends LibraryManagement { +class IvyLibraryManagement private[sbt] (val ivySbt: IvySbt) extends LibraryManagementInterface { type Module = ivySbt.Module override def moduleDescriptor(moduleSetting: ModuleDescriptorConfiguration): ModuleDescriptor = { @@ -26,5 +26,5 @@ class IvyLibraryManagement private[sbt] (val ivySbt: IvySbt) extends LibraryMana object IvyLibraryManagement { def apply(ivyConfiguration: IvyConfiguration): LibraryManagement = - new IvyLibraryManagement(new IvySbt(ivyConfiguration)) + LibraryManagement(new IvyLibraryManagement(new IvySbt(ivyConfiguration))) } diff --git a/ivy/src/main/scala/sbt/librarymanagement/ivy/IvyPublisher.scala b/ivy/src/main/scala/sbt/librarymanagement/ivy/IvyPublisher.scala index 323826fde..cc92e8bf9 100644 --- a/ivy/src/main/scala/sbt/librarymanagement/ivy/IvyPublisher.scala +++ b/ivy/src/main/scala/sbt/librarymanagement/ivy/IvyPublisher.scala @@ -6,7 +6,7 @@ import sbt.internal.librarymanagement._ import sbt.util.Logger import java.io.File -class IvyPublisher private[sbt] (val ivySbt: IvySbt) extends Publisher { +class IvyPublisher private[sbt] (val ivySbt: IvySbt) extends PublisherInterface { type Module = ivySbt.Module override def moduleDescriptor(moduleSetting: ModuleDescriptorConfiguration): ModuleDescriptor = { @@ -31,5 +31,5 @@ class IvyPublisher private[sbt] (val ivySbt: IvySbt) extends Publisher { object IvyPublisher { def apply(ivyConfiguration: IvyConfiguration): Publisher = - new IvyPublisher(new IvySbt(ivyConfiguration)) + Publisher(new IvyPublisher(new IvySbt(ivyConfiguration))) }