forked from akka/akka
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUnidoc.scala
79 lines (68 loc) · 3.11 KB
/
Unidoc.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package akka
import sbt._
import sbtunidoc.Plugin.UnidocKeys._
import sbtunidoc.Plugin.{ ScalaUnidoc, JavaUnidoc, scalaJavaUnidocSettings, genjavadocSettings, scalaUnidocSettings }
import sbt.Keys._
import sbt.File
import scala.annotation.tailrec
object Unidoc {
def settings(ignoreAggregates: Seq[Project], ignoreProjects: Seq[Project]) = {
val withoutAggregates = ignoreAggregates.foldLeft(inAnyProject) { _ -- inAggregates(_, transitive = true, includeRoot = true) }
val docProjectFilter = ignoreProjects.foldLeft(withoutAggregates) { _ -- inProjects(_) }
inTask(unidoc)(Seq(
unidocProjectFilter in ScalaUnidoc := docProjectFilter,
unidocProjectFilter in JavaUnidoc := docProjectFilter,
apiMappings in ScalaUnidoc := (apiMappings in (Compile, doc)).value
))
}
val genjavadocEnabled = sys.props.get("akka.genjavadoc.enabled").getOrElse("false").toBoolean
val (unidocSettings, javadocSettings) =
if (genjavadocEnabled) (scalaJavaUnidocSettings, genjavadocSettings)
else (scalaUnidocSettings, Nil)
lazy val scaladocDiagramsEnabled = sys.props.get("akka.scaladoc.diagrams").getOrElse("true").toBoolean
lazy val scaladocAutoAPI = sys.props.get("akka.scaladoc.autoapi").getOrElse("true").toBoolean
def scaladocSettings: Seq[sbt.Setting[_]] = {
scaladocSettingsNoVerificationOfDiagrams ++
(if (scaladocDiagramsEnabled) Seq(doc in Compile ~= scaladocVerifier) else Seq.empty)
}
// for projects with few (one) classes there might not be any diagrams
def scaladocSettingsNoVerificationOfDiagrams: Seq[sbt.Setting[_]] = {
inTask(doc)(Seq(
scalacOptions in Compile <++= (version, baseDirectory in ThisBuild) map scaladocOptions,
autoAPIMappings := scaladocAutoAPI
))
}
def scaladocOptions(ver: String, base: File): List[String] = {
val urlString = GitHub.url(ver) + "/€{FILE_PATH}.scala"
val opts = List("-implicits", "-doc-source-url", urlString, "-sourcepath", base.getAbsolutePath)
if (scaladocDiagramsEnabled) "-diagrams"::opts else opts
}
def scaladocVerifier(file: File): File= {
@tailrec
def findHTMLFileWithDiagram(dirs: Seq[File]): Boolean = {
if (dirs.isEmpty) false
else {
val curr = dirs.head
val (newDirs, files) = curr.listFiles.partition(_.isDirectory)
val rest = dirs.tail ++ newDirs
val hasDiagram = files exists { f =>
val name = f.getName
if (name.endsWith(".html") && !name.startsWith("index-") &&
!(name.compare("index.html") == 0) && !(name.compare("package.html") == 0)) {
val source = scala.io.Source.fromFile(f)("utf-8")
val hd = source.getLines().exists(_.contains("<div class=\"toggleContainer block diagram-container\" id=\"inheritance-diagram-container\">"))
source.close()
hd
}
else false
}
hasDiagram || findHTMLFileWithDiagram(rest)
}
}
// if we have generated scaladoc and none of the files have a diagram then fail
if (file.exists() && !findHTMLFileWithDiagram(List(file)))
sys.error("ScalaDoc diagrams not generated!")
else
file
}
}