|
Play Framework/Scala example source code file (Docs.scala)
The Docs.scala Play Framework example source code
/*
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
import sbt._
import sbt.Keys._
import sbt.File
import java.net.URLClassLoader
import org.webjars.{ FileSystemCache, WebJarExtractor }
object Docs {
val Webjars = config("webjars").hide
val apiDocsInclude = SettingKey[Boolean]("api-docs-include", "Whether this sub project should be included in the API docs")
val apiDocsIncludeManaged = SettingKey[Boolean]("api-docs-include-managed", "Whether managed sources from this project should be included in the API docs")
val apiDocsScalaSources = TaskKey[Seq[File]]("api-docs-scala-sources", "All the scala sources for all projects")
val apiDocsJavaSources = TaskKey[Seq[File]]("api-docs-java-sources", "All the Java sources for all projects")
val apiDocsClasspath = TaskKey[Seq[File]]("api-docs-classpath", "The classpath for API docs generation")
val apiDocs = TaskKey[File]("api-docs", "Generate the API docs")
val extractWebjars = TaskKey[File]("extract-webjars", "Extract webjar contents")
lazy val settings = Seq(
apiDocsInclude := false,
apiDocsIncludeManaged := false,
apiDocsScalaSources <<= (thisProjectRef, buildStructure) flatMap allSources(Compile, ".scala"),
apiDocsClasspath <<= (thisProjectRef, buildStructure) flatMap allClasspaths,
apiDocsJavaSources <<= (thisProjectRef, buildStructure) flatMap allSources(Compile, ".java"),
apiDocs <<= (apiDocsScalaSources, apiDocsJavaSources, apiDocsClasspath, baseDirectory in ThisBuild, target, compilers, streams, scalaVersion) map apiDocsTask,
ivyConfigurations += Webjars,
extractWebjars <<= extractWebjarContents,
mappings in (Compile, packageBin) <++= (baseDirectory, apiDocs, extractWebjars, version) map { (base, apiBase, webjars, playVersion) =>
// Include documentation and API docs in main binary JAR
val docBase = base / "../../../documentation"
val raw = (docBase \ "manual" ** "*") +++ (docBase \ "style" ** "*")
val filtered = raw.filter(_.getName != ".DS_Store")
val docMappings = filtered.get pair rebase(docBase, "play/docs/content/")
val apiDocMappings = (apiBase ** "*").get pair rebase(apiBase, "play/docs/content/api")
// The play version is added so that resource paths are versioned
val webjarMappings = webjars.*** pair rebase(webjars, "play/docs/content/webjars/" + playVersion)
docMappings ++ apiDocMappings ++ webjarMappings
}
)
def apiDocsTask(scalaSources: Seq[File], javaSources: Seq[File], classpath: Seq[File], buildBase: File,
target: File, compilers: Compiler.Compilers, streams: TaskStreams, scalaVersion: String): File = {
val targetDir = new File(target, "scala-" + CrossVersion.binaryScalaVersion(scalaVersion))
val version = BuildSettings.buildVersion
val sourceTree = if (version.endsWith("-SNAPSHOT")) {
BuildSettings.sourceCodeBranch
} else {
version
}
val apiTarget = new File(targetDir, "apidocs")
val scalaCache = new File(targetDir, "scalaapidocs.cache")
val javaCache = new File(targetDir, "javaapidocs.cache")
val label = "Play " + BuildSettings.buildVersion
val options = Seq(
// Note, this is used by the doc-source-url feature to determine the relative path of a given source file.
// If it's not a prefix of a the absolute path of the source file, the absolute path of that file will be put
// into the FILE_SOURCE variable below, which is definitely not what we want.
// Hence it needs to be the base directory for the build, not the base directory for the play-docs project.
"-sourcepath", buildBase.getAbsolutePath,
"-doc-source-url", "https://github.com/playframework/playframework/tree/" + sourceTree + "/framework€{FILE_PATH}.scala")
val scaladoc = Doc.scaladoc(label, scalaCache, compilers.scalac)
// Since there is absolutely no documentation on what the arguments here should be aside from their types, here
// are the parameter names of the method that does eventually get called:
// (sources, classpath, outputDirectory, options, maxErrors, log)
scaladoc(scalaSources, classpath, apiTarget / "scala", options, 10, streams.log)
val javadocOptions = Seq(
"-windowtitle", label,
"-notimestamp",
"-subpackages", "play",
"-exclude", "play.api:play.core"
)
val javadoc = Doc.javadoc(label, javaCache, compilers.javac)
javadoc(javaSources, classpath, apiTarget / "java", javadocOptions, 10, streams.log)
apiTarget
}
def allSources(conf: Configuration, extension: String)(projectRef: ProjectRef, structure: BuildStructure): Task[Seq[File]] = {
val projects = allApiProjects(projectRef.build, structure)
val sourceTasks = projects map { ref =>
def taskFromProject[T](task: TaskKey[T]) = task in conf in ref get structure.data
// Get all the Scala sources (not the Java ones)
val filteredSources = taskFromProject(sources).map(_.map(_.filter(_.name.endsWith(extension))))
// Join them
val tasks = filteredSources.toSeq
tasks.join.map(_.flatten)
}
sourceTasks.join.map(_.flatten)
}
/**
* Get all projects in the given build that have `apiDocsInclude` set to `true`.
* Recursively searches aggregated projects starting from the root project.
*/
def allApiProjects(build: URI, structure: BuildStructure): Seq[ProjectRef] = {
def aggregated(projectRef: ProjectRef): Seq[ProjectRef] = {
val project = Project.getProject(projectRef, structure)
val childRefs = project.toSeq.flatMap(_.aggregate)
childRefs flatMap { childRef =>
val includeApiDocs = (apiDocsInclude in childRef).get(structure.data).getOrElse(false)
if (includeApiDocs) childRef +: aggregated(childRef) else aggregated(childRef)
}
}
val rootProjectId = Load.getRootProject(structure.units)(build)
val rootProjectRef = ProjectRef(build, rootProjectId)
aggregated(rootProjectRef)
}
def allClasspaths(projectRef: ProjectRef, structure: BuildStructure): Task[Seq[File]] = {
val projects = allApiProjects(projectRef.build, structure)
val tasks = projects flatMap { dependencyClasspath in Compile in _ get structure.data }
tasks.join.map(_.flatten.map(_.data).distinct)
}
// Note: webjars are extracted without versions
def extractWebjarContents: Def.Initialize[Task[File]] = (update, target, streams) map { (report, targetDir, s) =>
val webjars = report.matching(configurationFilter(name = Webjars.name))
val webjarsDir = targetDir / "webjars"
val cache = new FileSystemCache(s.cacheDirectory / "webjars-cache")
val classLoader = new URLClassLoader(Path.toURLs(webjars), null)
val extractor = new WebJarExtractor(cache, classLoader)
extractor.extractAllWebJarsTo(webjarsDir)
cache.save()
webjarsDir
}
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework Docs.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.