docspell/build.sbt

1180 lines
34 KiB
Plaintext
Raw Normal View History

2019-07-17 20:03:10 +00:00
import com.github.eikek.sbt.openapi._
2022-04-09 12:25:41 +00:00
import com.github.sbt.git.SbtGit.GitKeys._
import docspell.build._
2021-07-04 08:15:30 +00:00
import de.heikoseeberger.sbtheader.CommentBlockCreator
2019-07-17 20:03:10 +00:00
2021-09-22 15:23:24 +00:00
val toolsPackage = taskKey[Seq[File]]("Package the scripts/extension tools")
val elmCompileMode = settingKey[ElmCompileMode]("How to compile elm sources")
// --- Settings
2020-06-28 18:47:19 +00:00
val scalafixSettings = Seq(
2021-09-22 15:23:24 +00:00
semanticdbEnabled := true, // enable SemanticDB
2021-12-11 19:30:47 +00:00
semanticdbVersion := scalafixSemanticdb.revision, // "4.4.0"
2020-06-28 18:47:19 +00:00
ThisBuild / scalafixDependencies ++= Dependencies.organizeImports
)
2019-07-17 20:03:10 +00:00
val sharedSettings = Seq(
2021-09-22 15:23:24 +00:00
organization := "com.github.eikek",
scalaVersion := "2.13.12",
2021-09-21 20:23:56 +00:00
organizationName := "Eike K. & Contributors",
licenses += ("AGPL-3.0-or-later", url(
"https://spdx.org/licenses/AGPL-3.0-or-later.html"
2021-07-04 08:15:30 +00:00
)),
2021-09-22 15:23:24 +00:00
startYear := Some(2020),
headerLicenseStyle := HeaderLicenseStyle.SpdxSyntax,
2021-07-04 08:15:30 +00:00
headerSources / excludeFilter := HiddenFileFilter || "*.java" || "StringUtil.scala",
2019-07-17 20:03:10 +00:00
scalacOptions ++= Seq(
"-deprecation",
2020-07-30 18:32:04 +00:00
"-encoding",
"UTF-8",
2019-07-17 20:03:10 +00:00
"-language:higherKinds",
"-feature",
"-Werror", // fail when there are warnings
2019-07-17 20:03:10 +00:00
"-unchecked",
2020-07-31 23:03:43 +00:00
// remove -byname-implicit, once https://github.com/scala/bug/issues/12072 is resolved
"-Xlint:-byname-implicit,_",
"-Wdead-code",
"-Wunused",
"-Wvalue-discard",
"-Wnumeric-widen",
"-Ywarn-macros:after"
2019-07-17 20:03:10 +00:00
),
javacOptions ++= Seq("-target", "1.8", "-source", "1.8"),
2020-07-30 18:32:04 +00:00
LocalRootProject / toolsPackage := {
2021-09-22 15:23:24 +00:00
val v = version.value
val logger = streams.value.log
2021-09-22 15:23:24 +00:00
val dir = (LocalRootProject / baseDirectory).value / "tools"
packageTools(logger, dir, v)
},
2021-04-10 15:16:01 +00:00
Compile / console / scalacOptions :=
(scalacOptions.value.filter(o => !o.contains("-Xlint") && !o.contains("-W"))),
2021-04-10 15:16:01 +00:00
Test / console / scalacOptions :=
(scalacOptions.value.filter(o => !o.contains("-Xlint") && !o.contains("-W"))),
libraryDependencySchemes ++= Seq(
2021-09-22 15:23:24 +00:00
"com.github.eikek" %% "calev-core" % VersionScheme.Always,
"com.github.eikek" %% "calev-circe" % VersionScheme.Always
2022-02-19 13:00:47 +00:00
),
addCompilerPlugin(Dependencies.kindProjectorPlugin)
2020-06-28 18:47:19 +00:00
) ++ scalafixSettings
2019-07-17 20:03:10 +00:00
lazy val noPublish = Seq(
2021-09-22 15:23:24 +00:00
publish := {},
publishLocal := {},
publishArtifact := false
)
2019-07-17 20:03:10 +00:00
val elmSettings = Seq(
elmCompileMode := ElmCompileMode.Debug,
2020-07-30 18:32:04 +00:00
Compile / resourceGenerators += Def.task {
2021-01-29 19:44:36 +00:00
val _ = openapiCodegen.value
2020-07-30 18:32:04 +00:00
compileElm(
streams.value.log,
(Compile / baseDirectory).value,
(Compile / resourceManaged).value,
name.value,
version.value,
elmCompileMode.value
)
}.taskValue,
2019-07-17 20:03:10 +00:00
watchSources += Watched.WatchSource(
2020-07-30 18:32:04 +00:00
(Compile / sourceDirectory).value / "elm",
FileFilter.globFilter("*.elm"),
HiddenFileFilter
2021-07-04 08:15:30 +00:00
),
Compile / unmanagedSourceDirectories += (Compile / sourceDirectory).value / "elm",
headerSources / includeFilter := "*.elm",
headerMappings := headerMappings.value + (HeaderFileType("elm") -> HeaderCommentStyle(
new CommentBlockCreator("{-", " ", "-}\n"),
HeaderPattern.commentBetween("\\{\\-", " ", "\\-\\}")
2021-07-04 08:15:30 +00:00
))
2019-07-17 20:03:10 +00:00
)
2021-01-29 19:44:36 +00:00
val stylesSettings = Seq(
stylesMode := StylesMode.Dev,
Compile / resourceGenerators += stylesBuild.taskValue
)
2019-07-17 20:03:10 +00:00
def webjarSettings(queryJS: Project) = Seq(
2020-07-30 18:32:04 +00:00
Compile / resourceGenerators += Def.task {
copyWebjarResources(
2021-04-10 15:16:01 +00:00
Seq((Compile / sourceDirectory).value / "webjar"),
2020-07-30 18:32:04 +00:00
(Compile / resourceManaged).value,
name.value,
version.value,
streams.value.log
2019-07-17 20:03:10 +00:00
)
}.taskValue,
Compile / resourceGenerators += Def.task {
val logger = streams.value.log
2021-09-22 15:23:24 +00:00
val out = (queryJS / Compile / fullOptJS).value
logger.info(s"Produced query js file: ${out.data}")
copyWebjarResources(
Seq(out.data),
2021-04-10 14:31:58 +00:00
(Compile / resourceManaged).value,
name.value,
version.value,
logger
)
}.taskValue,
2019-07-17 20:03:10 +00:00
watchSources += Watched.WatchSource(
2020-07-30 18:32:04 +00:00
(Compile / sourceDirectory).value / "webjar",
FileFilter.globFilter("*.js") || FileFilter.globFilter("*.css"),
HiddenFileFilter
2019-07-17 20:03:10 +00:00
)
)
2020-07-30 18:32:04 +00:00
def debianSettings(cfgFile: String) =
Seq(
2021-07-04 08:15:30 +00:00
maintainer := "Eike Kettner <eikek@posteo.de>",
2021-04-10 15:16:01 +00:00
Universal / mappings += {
2020-07-30 18:32:04 +00:00
val conf = (Compile / resourceDirectory).value / "reference.conf"
if (!conf.exists)
sys.error(s"File $conf not found")
conf -> s"conf/$cfgFile.conf"
},
daemonUser := "docspell",
2020-07-30 18:32:04 +00:00
bashScriptExtraDefines += s"""addJava "-Dconfig.file=$${app_home}/../conf/$cfgFile.conf""""
)
2019-07-17 20:03:10 +00:00
val buildInfoSettings = Seq(
2020-07-30 18:32:04 +00:00
buildInfoKeys := Seq[BuildInfoKey](
name,
version,
scalaVersion,
sbtVersion,
gitHeadCommit,
gitHeadCommitDate,
gitUncommittedChanges,
gitDescribedVersion
),
2019-07-17 20:03:10 +00:00
buildInfoOptions += BuildInfoOption.ToJson,
buildInfoOptions += BuildInfoOption.BuildTime
)
val openapiScalaSettings = Seq(
2020-07-30 18:32:04 +00:00
openapiScalaConfig := ScalaConfig()
.withJson(ScalaJson.circeSemiauto)
2021-08-19 06:50:30 +00:00
.addMapping(CustomMapping.forType { case TypeDef("LocalDateTime", _) =>
TypeDef("Timestamp", Imports("docspell.common.Timestamp"))
2021-08-19 06:50:30 +00:00
})
.addMapping(CustomMapping.forFormatType {
2020-07-30 18:32:04 +00:00
case "ident" =>
field => field.copy(typeDef = TypeDef("Ident", Imports("docspell.common.Ident")))
2021-01-04 15:32:54 +00:00
case "accountid" =>
field =>
field.copy(typeDef = TypeDef("AccountId", Imports("docspell.common.AccountId")))
2020-07-30 18:32:04 +00:00
case "collectivestate" =>
field =>
field.copy(typeDef =
TypeDef("CollectiveState", Imports("docspell.common.CollectiveState"))
)
case "userstate" =>
field =>
field.copy(typeDef = TypeDef("UserState", Imports("docspell.common.UserState")))
case "password" =>
field =>
field.copy(typeDef = TypeDef("Password", Imports("docspell.common.Password")))
case "contactkind" =>
field =>
field.copy(typeDef =
TypeDef("ContactKind", Imports("docspell.common.ContactKind"))
)
case "direction" =>
field =>
field.copy(typeDef = TypeDef("Direction", Imports("docspell.common.Direction")))
case "priority" =>
field =>
field.copy(typeDef = TypeDef("Priority", Imports("docspell.common.Priority")))
case "jobstate" =>
field =>
field.copy(typeDef = TypeDef("JobState", Imports("docspell.common.JobState")))
case "loglevel" =>
field =>
field.copy(typeDef = TypeDef("LogLevel", Imports("docspell.common.LogLevel")))
case "mimetype" =>
field =>
field.copy(typeDef = TypeDef("MimeType", Imports("docspell.common.MimeType")))
case "itemstate" =>
field =>
field.copy(typeDef = TypeDef("ItemState", Imports("docspell.common.ItemState")))
case "nertag" =>
field =>
field.copy(typeDef = TypeDef("NerTag", Imports("docspell.common.NerTag")))
case "language" =>
field =>
field.copy(typeDef = TypeDef("Language", Imports("docspell.common.Language")))
case "calevent" =>
field =>
field.copy(typeDef =
TypeDef(
"CalEvent",
Imports(
"com.github.eikek.calev.CalEvent",
"com.github.eikek.calev.circe.CalevCirceCodec._"
)
)
)
case "glob" =>
field => field.copy(typeDef = TypeDef("Glob", Imports("docspell.common.Glob")))
2020-09-28 20:54:35 +00:00
case "customfieldtype" =>
field =>
field.copy(typeDef =
TypeDef("CustomFieldType", Imports("docspell.common.CustomFieldType"))
)
case "listtype" =>
field =>
field.copy(typeDef = TypeDef("ListType", Imports("docspell.common.ListType")))
case "personuse" =>
field =>
field.copy(typeDef = TypeDef("PersonUse", Imports("docspell.common.PersonUse")))
case "orguse" =>
field =>
field.copy(typeDef = TypeDef("OrgUse", Imports("docspell.common.OrgUse")))
case "equipmentuse" =>
field =>
2021-04-10 14:31:58 +00:00
field.copy(typeDef =
TypeDef("EquipmentUse", Imports("docspell.common.EquipmentUse"))
)
case "searchmode" =>
field =>
field
.copy(typeDef = TypeDef("SearchMode", Imports("docspell.common.SearchMode")))
case "duration" =>
field =>
field
.copy(typeDef = TypeDef("Duration", Imports("docspell.common.Duration")))
2021-08-30 14:15:13 +00:00
case "uri" =>
field =>
field
.copy(typeDef = TypeDef("LenientUri", Imports("docspell.common.LenientUri")))
case "accountsource" =>
field =>
field
.copy(typeDef =
TypeDef("AccountSource", Imports("docspell.common.AccountSource"))
)
2021-10-02 13:16:02 +00:00
case "itemquery" =>
field =>
field
.copy(typeDef =
TypeDef(
"ItemQuery",
Imports(
"docspell.query.ItemQuery",
"docspell.restapi.codec.ItemQueryJson._"
)
)
)
case "channeltype" =>
field =>
field.copy(typeDef =
TypeDef("ChannelType", Imports("docspell.notification.api.ChannelType"))
)
case "eventtype" =>
field =>
field.copy(typeDef =
TypeDef("EventType", Imports("docspell.notification.api.EventType"))
)
case "jsonminiq" =>
field =>
field.copy(typeDef =
TypeDef("JsonMiniQuery", Imports("docspell.jsonminiq.JsonMiniQuery"))
)
2022-04-09 12:01:36 +00:00
case "downloadalltype" =>
field =>
field.copy(typeDef =
TypeDef("DownloadAllType", Imports("docspell.common.DownloadAllType"))
)
case "bytesize" =>
field =>
field.copy(typeDef = TypeDef("ByteSize", Imports("docspell.common.ByteSize")))
case "downloadstate" =>
field =>
field.copy(typeDef =
TypeDef("DownloadState", Imports("docspell.common.DownloadState"))
)
case "addon-trigger-type" =>
field =>
field.copy(typeDef =
TypeDef("AddonTriggerType", Imports("docspell.addons.AddonTriggerType"))
)
case "addon-runner-type" =>
field =>
field
.copy(typeDef = TypeDef("RunnerType", Imports("docspell.addons.RunnerType")))
2021-08-19 06:50:30 +00:00
})
)
// --- Modules
2019-07-17 20:03:10 +00:00
2022-02-19 13:00:47 +00:00
val loggingApi = project
.in(file("modules/logging/api"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettings
.settings(
name := "docspell-logging-api",
libraryDependencies ++=
Dependencies.catsEffect ++
Dependencies.circeCore ++
Dependencies.fs2Core ++
Dependencies.sourcecode
)
val loggingScribe = project
.in(file("modules/logging/scribe"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettings
.settings(
name := "docspell-logging-scribe",
libraryDependencies ++=
Dependencies.scribe ++
Dependencies.catsEffect ++
Dependencies.circeCore ++
Dependencies.fs2Core
)
.dependsOn(loggingApi)
// Base module, everything depends on this including restapi and
// joexapi modules. This should aim to have least possible
// dependencies
2020-07-30 18:32:04 +00:00
val common = project
.in(file("modules/common"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettingsDependsOn(loggingScribe)
2020-07-30 18:32:04 +00:00
.settings(
2019-07-17 20:03:10 +00:00
name := "docspell-common",
libraryDependencies ++=
Dependencies.fs2 ++
2020-07-30 18:32:04 +00:00
Dependencies.circe ++
Dependencies.circeGenericExtra ++
2020-07-30 18:32:04 +00:00
Dependencies.calevCore ++
Dependencies.calevCirce
2019-07-17 20:03:10 +00:00
)
2022-02-19 13:00:47 +00:00
.dependsOn(loggingApi)
2019-07-17 20:03:10 +00:00
// Some example files for testing
// https://file-examples.com/index.php/sample-documents-download/sample-doc-download/
2020-07-30 18:32:04 +00:00
val files = project
.in(file("modules/files"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettingsDependsOn(loggingScribe)
2020-07-30 18:32:04 +00:00
.settings(
2020-02-14 10:14:09 +00:00
name := "docspell-files",
2020-02-14 10:09:39 +00:00
libraryDependencies ++=
Dependencies.tika ++
2020-07-30 18:32:04 +00:00
Dependencies.icu4j,
2020-02-14 10:09:39 +00:00
Test / sourceGenerators += Def.task {
2021-09-22 15:23:24 +00:00
val base = (Test / resourceDirectory).value
2020-07-30 18:32:04 +00:00
val files = (base ** (_.isFile)).pair(sbt.io.Path.relativeTo(base))
val lines = files.toList.map(_._2).map { s =>
2020-02-14 10:09:39 +00:00
val ident = s.replaceAll("[^a-zA-Z0-9_]+", "_")
val sanitized = s.replace('\\', '/')
ident -> s"""val $ident = createUrl("$sanitized")"""
2020-07-30 18:32:04 +00:00
}
2020-02-14 10:14:09 +00:00
val content = s"""package docspell.files
2020-02-14 10:09:39 +00:00
object ExampleFiles extends ExampleFilesSupport {
${lines.map(_._2).mkString("\n")}
val all = List(
${lines.map(_._1).mkString(",\n")}
)
}
"""
2021-08-19 06:50:30 +00:00
val target = (Test / sourceManaged).value / "scala" / "ExampleFiles.scala"
2020-02-14 10:09:39 +00:00
IO.createDirectory(target.getParentFile)
IO.write(target, content)
Seq(target)
}.taskValue
2020-07-30 18:31:53 +00:00
)
.dependsOn(common, loggingScribe)
2020-07-30 18:31:53 +00:00
2021-02-21 11:04:48 +00:00
val query =
crossProject(JSPlatform, JVMPlatform)
2021-02-28 20:15:21 +00:00
.withoutSuffixFor(JVMPlatform)
2021-02-21 11:04:48 +00:00
.in(file("modules/query"))
.disablePlugins(RevolverPlugin)
2021-02-21 11:04:48 +00:00
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
2021-02-21 11:04:48 +00:00
.settings(
name := "docspell-query",
libraryDependencies +=
Dependencies.catsParseJS.value,
libraryDependencies +=
Dependencies.scalaJavaTime.value
2021-02-21 11:04:48 +00:00
)
2021-02-23 23:22:45 +00:00
.jsSettings(
Test / fork := false
)
2021-02-21 11:04:48 +00:00
.jvmSettings(
libraryDependencies +=
Dependencies.scalaJsStubs
)
val totp = project
.in(file("modules/totp"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
.settings(
name := "docspell-totp",
libraryDependencies ++=
Dependencies.javaOtp ++
Dependencies.scodecBits ++
Dependencies.fs2 ++
Dependencies.circe
)
val jsonminiq = project
.in(file("modules/jsonminiq"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
.settings(
name := "docspell-jsonminiq",
libraryDependencies ++=
Dependencies.circeCore ++
Dependencies.catsParse ++
Dependencies.circe.map(_ % Test)
)
val notificationApi = project
.in(file("modules/notification/api"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
.settings(
name := "docspell-notification-api",
libraryDependencies ++=
Dependencies.fs2 ++
Dependencies.emilCommon ++
Dependencies.circeGenericExtra
)
2022-02-19 13:00:47 +00:00
.dependsOn(common, loggingScribe)
val addonlib = project
.in(file("modules/addonlib"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettingsDependsOn(loggingScribe)
.settings(
libraryDependencies ++=
Dependencies.fs2 ++
Dependencies.circe ++
Dependencies.circeYaml
)
.dependsOn(common, files, loggingScribe)
val ftsclient = project
.in(file("modules/fts-client"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettings
.settings(
name := "docspell-fts-client",
libraryDependencies ++= Seq.empty
)
.dependsOn(common, loggingScribe)
2020-07-30 18:31:53 +00:00
val store = project
.in(file("modules/store"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 22:33:01 +00:00
.withTestSettingsDependsOn(loggingScribe)
2020-07-30 18:31:53 +00:00
.settings(
2019-07-17 20:03:10 +00:00
name := "docspell-store",
libraryDependencies ++=
Dependencies.doobie ++
Dependencies.binny ++
2020-07-30 18:31:53 +00:00
Dependencies.tika ++
Dependencies.fs2 ++
Dependencies.databases ++
Dependencies.flyway ++
Dependencies.emil ++
Dependencies.emilDoobie ++
Dependencies.calevCore ++
Dependencies.calevFs2,
libraryDependencies ++=
Dependencies.testContainer.map(_ % Test)
2020-07-30 18:31:53 +00:00
)
.dependsOn(
common,
addonlib,
query.jvm,
totp,
files,
notificationApi,
jsonminiq,
ftsclient,
loggingScribe
)
val notificationImpl = project
.in(file("modules/notification/impl"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
.settings(
name := "docspell-notification-impl",
libraryDependencies ++=
Dependencies.fs2 ++
Dependencies.emil ++
Dependencies.emilMarkdown ++
Dependencies.http4sClient ++
Dependencies.http4sCirce ++
Dependencies.http4sDsl ++
Dependencies.yamusca ++
Dependencies.yamuscaCirce
)
.dependsOn(notificationApi, store, jsonminiq)
2020-07-30 18:31:53 +00:00
val pubsubApi = project
.in(file("modules/pubsub/api"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
.settings(
name := "docspell-pubsub-api",
libraryDependencies ++=
Dependencies.fs2
)
.dependsOn(common)
val pubsubNaive = project
.in(file("modules/pubsub/naive"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
.settings(
name := "docspell-pubsub-naive",
libraryDependencies ++=
Dependencies.fs2 ++
Dependencies.http4sCirce ++
Dependencies.http4sDsl ++
Dependencies.http4sClient ++
Dependencies.circe
)
.dependsOn(common, pubsubApi, store % "compile->compile;test->test")
val schedulerApi = project
.in(file("modules/scheduler/api"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettingsDependsOn(loggingScribe)
.settings(
name := "docspell-scheduler-api",
libraryDependencies ++=
Dependencies.fs2Core ++
Dependencies.circeCore
)
.dependsOn(loggingApi, common, pubsubApi)
val schedulerImpl = project
.in(file("modules/scheduler/impl"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettingsDependsOn(loggingScribe)
.settings(
name := "docspell-scheduler-impl"
)
.dependsOn(
store % "compile->compile;test->test",
schedulerApi,
notificationApi,
pubsubApi
)
2020-07-30 18:31:53 +00:00
val extract = project
.in(file("modules/extract"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 22:33:01 +00:00
.withTestSettingsDependsOn(loggingScribe)
2020-07-30 18:31:53 +00:00
.settings(
name := "docspell-extract",
libraryDependencies ++=
Dependencies.fs2 ++
2020-07-30 18:31:53 +00:00
Dependencies.twelvemonkeys ++
Dependencies.pdfbox ++
Dependencies.poi ++
2022-02-19 21:01:49 +00:00
Dependencies.commonsIO
2020-07-30 18:31:53 +00:00
)
2022-02-19 13:00:47 +00:00
.dependsOn(common, loggingScribe, files % "compile->compile;test->test")
2020-07-30 18:31:53 +00:00
val convert = project
.in(file("modules/convert"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 22:33:01 +00:00
.withTestSettingsDependsOn(loggingScribe)
2020-07-30 18:31:53 +00:00
.settings(
name := "docspell-convert",
libraryDependencies ++=
2020-02-18 20:32:21 +00:00
Dependencies.flexmark ++
Dependencies.twelvemonkeys ++
Dependencies.pdfbox
2020-07-30 18:31:53 +00:00
)
.dependsOn(common, files % "compile->compile;test->test")
val analysis = project
.in(file("modules/analysis"))
.disablePlugins(RevolverPlugin)
.enablePlugins(NerModelsPlugin)
.settings(sharedSettings)
2022-02-19 22:33:01 +00:00
.withTestSettingsDependsOn(loggingScribe)
2020-07-30 18:31:53 +00:00
.settings(NerModelsPlugin.nerClassifierSettings)
.settings(
name := "docspell-analysis",
libraryDependencies ++=
Dependencies.fs2 ++
2020-07-30 18:31:53 +00:00
Dependencies.stanfordNlpCore
)
2022-02-19 13:00:47 +00:00
.dependsOn(common, files % "test->test", loggingScribe)
2020-07-30 18:31:53 +00:00
val ftssolr = project
.in(file("modules/fts-solr"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
2020-07-30 18:31:53 +00:00
.settings(
2020-06-14 20:53:20 +00:00
name := "docspell-fts-solr",
libraryDependencies ++=
Dependencies.http4sClient ++
2020-07-30 18:31:53 +00:00
Dependencies.http4sCirce ++
Dependencies.http4sDsl ++
Dependencies.circe
)
.dependsOn(common, ftsclient)
val ftspsql = project
.in(file("modules/fts-psql"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettings
.settings(
name := "docspell-fts-psql",
libraryDependencies ++=
Dependencies.doobie ++
Dependencies.postgres ++
Dependencies.flyway
)
.dependsOn(common, ftsclient, store % "compile->compile;test->test")
2020-07-30 18:31:53 +00:00
val restapi = project
.in(file("modules/restapi"))
.disablePlugins(RevolverPlugin)
.enablePlugins(OpenApiSchema)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
2020-07-30 18:31:53 +00:00
.settings(openapiScalaSettings)
.settings(
2019-07-17 20:03:10 +00:00
name := "docspell-restapi",
libraryDependencies ++=
Dependencies.circe ++ Dependencies.emil,
2019-07-17 20:03:10 +00:00
openapiTargetLanguage := Language.Scala,
2021-09-22 15:23:24 +00:00
openapiPackage := Pkg("docspell.restapi.model"),
openapiSpec := (Compile / resourceDirectory).value / "docspell-openapi.yml",
openapiStaticGen := OpenApiDocGenerator.Redoc
2020-07-30 18:31:53 +00:00
)
.dependsOn(common, query.jvm, notificationApi, jsonminiq, addonlib)
2020-07-30 18:31:53 +00:00
val joexapi = project
.in(file("modules/joexapi"))
.disablePlugins(RevolverPlugin)
.enablePlugins(OpenApiSchema)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
2020-07-30 18:31:53 +00:00
.settings(openapiScalaSettings)
.settings(
2019-07-17 20:03:10 +00:00
name := "docspell-joexapi",
libraryDependencies ++=
Dependencies.circe ++
2020-07-30 18:31:53 +00:00
Dependencies.http4sCirce ++
Dependencies.http4sClient,
2019-07-17 20:03:10 +00:00
openapiTargetLanguage := Language.Scala,
2021-09-22 15:23:24 +00:00
openapiPackage := Pkg("docspell.joexapi.model"),
openapiSpec := (Compile / resourceDirectory).value / "joex-openapi.yml",
openapiStaticGen := OpenApiDocGenerator.Redoc
2020-07-30 18:31:53 +00:00
)
.dependsOn(common, loggingScribe, addonlib)
2020-07-30 18:31:53 +00:00
val backend = project
.in(file("modules/backend"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
2020-07-30 18:31:53 +00:00
.settings(
2019-07-17 20:03:10 +00:00
name := "docspell-backend",
libraryDependencies ++=
2022-02-19 22:33:01 +00:00
Dependencies.fs2 ++
2020-07-30 18:31:53 +00:00
Dependencies.bcrypt ++
Dependencies.http4sClient ++
Dependencies.emil
)
.dependsOn(
addonlib,
store,
notificationApi,
joexapi,
ftsclient,
totp,
pubsubApi,
loggingApi,
schedulerApi
)
2020-07-30 18:31:53 +00:00
val oidc = project
.in(file("modules/oidc"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
.settings(
name := "docspell-oidc",
libraryDependencies ++=
2022-02-19 22:33:01 +00:00
Dependencies.fs2 ++
Dependencies.http4sClient ++
Dependencies.http4sCirce ++
Dependencies.http4sDsl ++
Dependencies.circe ++
Dependencies.jwtScala
)
2022-02-19 13:00:47 +00:00
.dependsOn(common, loggingScribe)
2020-07-30 18:31:53 +00:00
val webapp = project
.in(file("modules/webapp"))
.disablePlugins(RevolverPlugin)
2021-01-29 19:44:36 +00:00
.enablePlugins(OpenApiSchema, StylesPlugin)
2020-07-30 18:31:53 +00:00
.settings(sharedSettings)
.settings(elmSettings)
2021-01-29 19:44:36 +00:00
.settings(stylesSettings)
.settings(webjarSettings(query.js))
2020-07-30 18:31:53 +00:00
.settings(
2021-09-22 15:23:24 +00:00
name := "docspell-webapp",
2019-07-17 20:03:10 +00:00
openapiTargetLanguage := Language.Elm,
2021-09-22 15:23:24 +00:00
openapiPackage := Pkg("Api.Model"),
2020-07-30 18:31:53 +00:00
openapiSpec := (restapi / Compile / resourceDirectory).value / "docspell-openapi.yml",
2019-07-17 20:03:10 +00:00
openapiElmConfig := ElmConfig().withJson(ElmJson.decodePipeline)
)
2021-02-23 00:24:24 +00:00
.dependsOn(query.js)
2019-07-17 20:03:10 +00:00
2022-03-21 10:04:58 +00:00
// Config project shared among the two applications only
val config = project
.in(file("modules/config"))
.disablePlugins(RevolverPlugin)
.settings(sharedSettings)
.withTestSettings
.settings(
name := "docspell-config",
libraryDependencies ++=
Dependencies.fs2 ++
Dependencies.pureconfig
)
.dependsOn(common, loggingApi, ftspsql, store, addonlib)
2022-03-21 10:04:58 +00:00
// --- Application(s)
2020-07-30 18:31:53 +00:00
val joex = project
.in(file("modules/joex"))
.enablePlugins(
BuildInfoPlugin,
JavaServerAppPackaging,
DebianPlugin,
SystemdPlugin,
ClasspathJarPlugin
)
2020-07-30 18:31:53 +00:00
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
2020-07-30 18:31:53 +00:00
.settings(debianSettings("docspell-joex"))
.settings(buildInfoSettings)
.settings(
name := "docspell-joex",
description := "The joex component (job executor) for docspell which executes long-running tasks.",
2021-09-22 15:23:24 +00:00
packageSummary := "Docspell Joex",
packageDescription := description.value,
libraryDependencies ++=
Dependencies.fs2 ++
2020-07-30 18:31:53 +00:00
Dependencies.http4sServer ++
Dependencies.http4sCirce ++
Dependencies.http4sDsl ++
Dependencies.circe ++
Dependencies.pureconfig ++
Dependencies.pureconfigIp4s ++
2020-07-30 18:31:53 +00:00
Dependencies.emilTnef ++
2021-01-24 19:06:53 +00:00
Dependencies.poi ++
2020-07-30 18:31:53 +00:00
Dependencies.emilMarkdown ++
Dependencies.emilJsoup ++
Dependencies.jsoup ++
2022-02-19 21:01:49 +00:00
Dependencies.yamusca,
addCompilerPlugin(Dependencies.betterMonadicFor),
buildInfoPackage := "docspell.joex",
2020-07-30 18:31:53 +00:00
reStart / javaOptions ++= Seq(
s"-Dconfig.file=${(LocalRootProject / baseDirectory).value / "local" / "dev.conf"}",
"-Xmx1596M",
"-XX:+UseG1GC"
2020-12-16 23:11:33 +00:00
),
Revolver.enableDebugging(port = 5051, suspend = false)
2020-07-30 18:31:53 +00:00
)
.dependsOn(
config,
2022-02-19 13:00:47 +00:00
loggingApi,
loggingScribe,
store,
backend,
extract,
convert,
analysis,
joexapi,
restapi,
ftssolr,
ftspsql,
pubsubNaive,
notificationImpl,
schedulerImpl
)
2020-07-30 18:31:53 +00:00
val restserver = project
.in(file("modules/restserver"))
.enablePlugins(
BuildInfoPlugin,
JavaServerAppPackaging,
DebianPlugin,
SystemdPlugin,
ClasspathJarPlugin
)
2020-07-30 18:31:53 +00:00
.settings(sharedSettings)
2022-02-19 13:00:47 +00:00
.withTestSettings
2020-07-30 18:31:53 +00:00
.settings(debianSettings("docspell-server"))
.settings(buildInfoSettings)
.settings(
2021-09-22 15:23:24 +00:00
name := "docspell-restserver",
description := "Docspell server providing the user interface and a REST Api.",
packageSummary := "Docspell Rest server",
packageDescription := description.value,
2019-07-17 20:03:10 +00:00
libraryDependencies ++=
2020-06-18 22:43:35 +00:00
Dependencies.http4sServer ++
2020-07-30 18:31:53 +00:00
Dependencies.http4sCirce ++
Dependencies.http4sDsl ++
Dependencies.circe ++
Dependencies.pureconfig ++
Dependencies.pureconfigIp4s ++
2020-07-30 18:31:53 +00:00
Dependencies.yamusca ++
Dependencies.kittens ++
2022-02-19 21:01:49 +00:00
Dependencies.webjars,
2019-07-17 20:03:10 +00:00
addCompilerPlugin(Dependencies.betterMonadicFor),
buildInfoPackage := "docspell.restserver",
2020-07-30 18:31:53 +00:00
Compile / sourceGenerators += Def.task {
createWebjarSource(Dependencies.webjars, (Compile / sourceManaged).value)
}.taskValue,
2020-07-30 18:31:53 +00:00
Compile / resourceGenerators += Def.task {
copyWebjarResources(
Seq((restapi / Compile / resourceDirectory).value / "docspell-openapi.yml"),
(Compile / resourceManaged).value,
name.value,
version.value,
streams.value.log
)
}.taskValue,
2020-07-30 18:31:53 +00:00
Compile / unmanagedResourceDirectories ++= Seq(
(Compile / resourceDirectory).value.getParentFile / "templates"
),
reStart / javaOptions ++= Seq(
s"-Dconfig.file=${(LocalRootProject / baseDirectory).value / "local" / "dev.conf"}",
"-Xmx150M",
"-XX:+UseG1GC"
2020-12-16 23:11:33 +00:00
),
Revolver.enableDebugging(port = 5050, suspend = false),
Universal / mappings := {
val allMappings = (Universal / mappings).value
allMappings.filter {
2021-12-11 19:30:47 +00:00
// scalajs artifacts are not needed at runtime
case (file, name) => !name.contains("_sjs1_")
}
}
2020-07-30 18:31:53 +00:00
)
.dependsOn(
config,
2022-02-19 13:00:47 +00:00
loggingApi,
loggingScribe,
restapi,
joexapi,
backend,
webapp,
ftssolr,
ftspsql,
oidc,
pubsubNaive,
2022-03-13 13:27:06 +00:00
notificationImpl,
schedulerImpl
)
2020-07-27 20:13:22 +00:00
// --- Website Documentation
2020-07-30 18:31:53 +00:00
val website = project
.in(file("website"))
.disablePlugins(RevolverPlugin, ReleasePlugin)
.enablePlugins(ZolaPlugin, GitHubPagesPlugin)
2020-07-30 18:31:53 +00:00
.settings(sharedSettings)
.settings(
2021-09-22 15:23:24 +00:00
name := "docspell-website",
publishArtifact := false,
publish / skip := true,
gitHubPagesOrgName := "eikek",
gitHubPagesRepoName := "docspell",
2021-09-22 15:23:24 +00:00
gitHubPagesSiteDir := zolaOutputDir.value,
2020-07-30 18:31:53 +00:00
Compile / resourceGenerators += Def.task {
val templateOut = baseDirectory.value / "site" / "templates" / "shortcodes"
2021-09-22 15:23:24 +00:00
val staticOut = baseDirectory.value / "site" / "static" / "openapi"
2020-07-27 20:13:22 +00:00
IO.createDirectories(Seq(templateOut, staticOut))
val files = Seq(
2021-08-19 06:50:30 +00:00
(restserver / Compile / resourceDirectory).value / "reference.conf" -> templateOut / "server.conf",
(joex / Compile / resourceDirectory).value / "reference.conf" -> templateOut / "joex.conf",
2020-07-30 18:31:53 +00:00
(LocalRootProject / baseDirectory).value / "tools" / "exim" / "exim.conf" -> templateOut / "sample-exim.conf",
2021-08-19 06:50:30 +00:00
(restapi / Compile / resourceDirectory).value / "docspell-openapi.yml" -> staticOut / "docspell-openapi.yml",
(restapi / Compile / openapiStaticDoc).value -> staticOut / "docspell-openapi.html"
)
IO.copy(files)
2020-07-27 20:13:22 +00:00
files.map(_._2)
}.taskValue,
Compile / resourceGenerators += Def.task {
val templateOut =
baseDirectory.value / "site" / "templates" / "shortcodes" / "config.env.txt"
val files = List(
(restserver / Compile / resourceDirectory).value / "reference.conf",
(joex / Compile / resourceDirectory).value / "reference.conf"
)
val cfg = EnvConfig.makeConfig(files)
EnvConfig.serializeTo(cfg, templateOut)
Seq(templateOut)
}.taskValue,
2020-07-30 18:31:53 +00:00
Compile / resourceGenerators += Def.task {
2020-07-27 20:13:22 +00:00
val changelog = (LocalRootProject / baseDirectory).value / "Changelog.md"
2022-01-27 19:23:15 +00:00
val targetDir = baseDirectory.value / "site" / "content" / "docs" / "install"
2020-07-27 20:13:22 +00:00
IO.createDirectory(targetDir)
2022-01-27 19:23:15 +00:00
val target = targetDir / "changelog.md"
2020-07-27 20:13:22 +00:00
2020-07-30 18:31:53 +00:00
IO.write(
target,
"""|+++
2021-09-22 15:23:24 +00:00
|title = "Changelog"
|description = "See what changed between releases."
2022-01-27 19:23:15 +00:00
|weight = 10000
2021-09-22 15:23:24 +00:00
|insert_anchor_links = "right"
|+++
|""".stripMargin
2020-07-30 18:31:53 +00:00
)
2020-07-27 20:13:22 +00:00
IO.append(target, IO.readBytes(changelog))
Seq(target)
2022-05-16 13:01:28 +00:00
}.taskValue,
zolaPrepare := {
val log = streams.value.log
log.info("Generating examples…")
val templateOut = baseDirectory.value / "site" / "templates" / "shortcodes"
IO.createDirectory(templateOut)
// sbt crashes when interpolating values into the string in `toTask`
// this is the reason for the followingy construct…
(Compile / run).toTask(s" addon-output /tmp/addon-output.json").value
(Compile / run).toTask(s" item-data /tmp/item-data.json").value
(Compile / run).toTask(s" item-args /tmp/item-args.json").value
(Compile / run).toTask(s" file-meta /tmp/file-meta.json").value
val inputs = List("addon-output", "item-data", "item-args", "file-meta")
inputs.foreach { name =>
IO.move(file(s"/tmp/$name.json"), templateOut / name)
}
}
)
2022-05-16 13:01:28 +00:00
.dependsOn(addonlib, joex)
2020-07-30 18:31:53 +00:00
val root = project
.in(file("."))
.disablePlugins(RevolverPlugin)
2020-07-30 18:31:53 +00:00
.settings(sharedSettings)
.settings(noPublish)
.settings(
2019-07-17 20:03:10 +00:00
name := "docspell-root"
2020-07-30 18:31:53 +00:00
)
.aggregate(
common,
addonlib,
2022-02-19 13:00:47 +00:00
loggingApi,
loggingScribe,
config,
2020-07-30 18:31:53 +00:00
extract,
convert,
analysis,
ftsclient,
ftssolr,
ftspsql,
2020-07-30 18:31:53 +00:00
files,
store,
joexapi,
joex,
backend,
webapp,
restapi,
2021-02-21 11:04:48 +00:00
restserver,
2021-02-23 00:24:24 +00:00
query.jvm,
query.js,
jsonminiq,
totp,
oidc,
pubsubApi,
pubsubNaive,
notificationApi,
notificationImpl,
schedulerApi,
schedulerImpl
2020-07-30 18:31:53 +00:00
)
2019-07-17 20:03:10 +00:00
// --- Helpers
2020-09-02 22:22:06 +00:00
def copyWithGZ(src: File, target: File): Seq[File] = {
val gzipFilter = "*.html" || "*.css" || "*.js"
IO.copy(Seq(src -> target))
if (gzipFilter.accept(src)) {
val gz = file(target.toString + ".gz")
IO.gzip(src, gz)
Seq(target, gz)
} else {
Seq(target)
}
}
2020-07-30 18:31:53 +00:00
def copyWebjarResources(
src: Seq[File],
base: File,
artifact: String,
version: String,
logger: Logger
): Seq[File] = {
val targetDir = base / "META-INF" / "resources" / "webjars" / artifact / version
logger.info(s"Copy webjar resources from ${src.size} files/directories.")
2019-07-17 20:03:10 +00:00
src.flatMap { dir =>
if (dir.isDirectory) {
2020-07-30 18:31:53 +00:00
val files = (dir ** "*").filter(_.isFile).get.pair(Path.relativeTo(dir))
files.flatMap { case (f, name) =>
val target = targetDir / name
IO.createDirectories(Seq(target.getParentFile))
copyWithGZ(f, target)
2019-07-17 20:03:10 +00:00
}
} else {
2020-07-30 18:31:53 +00:00
val target = targetDir / dir.name
2019-07-17 20:03:10 +00:00
IO.createDirectories(Seq(target.getParentFile))
2020-09-02 22:22:06 +00:00
copyWithGZ(dir, target)
2019-07-17 20:03:10 +00:00
}
}
}
2020-07-30 18:32:04 +00:00
def compileElm(
logger: Logger,
wd: File,
outBase: File,
artifact: String,
version: String,
mode: ElmCompileMode
): Seq[File] = {
2019-07-17 20:03:10 +00:00
logger.info("Compile elm files ...")
2020-07-30 18:32:04 +00:00
val target =
outBase / "META-INF" / "resources" / "webjars" / artifact / version / "docspell-app.js"
val cmd = (Seq("elm", "make")
++ mode.flags
++ Seq("--output", target.toString)
++ Seq(wd / "src" / "main" / "elm" / "Main.elm").map(_.toString))
Cmd.run(cmd, wd, logger)
2020-09-02 22:22:06 +00:00
val targetGZ = file(target.toString + ".gz")
IO.gzip(target, targetGZ)
Seq(target, targetGZ)
2019-07-17 20:03:10 +00:00
}
def createWebjarSource(wj: Seq[ModuleID], out: File): Seq[File] = {
2021-09-22 15:23:24 +00:00
val target = out / "Webjars.scala"
val badChars = "-.".toSet
2020-07-30 18:32:04 +00:00
val fields = wj
.map(m =>
s"""val ${m.name.toLowerCase.filter(c =>
2022-02-05 21:49:11 +00:00
!badChars.contains(c)
)} = "/${m.name}/${m.revision}" """
2020-07-30 18:32:04 +00:00
)
.mkString("\n\n")
2019-07-17 20:03:10 +00:00
val content = s"""package docspell.restserver.webapp
2021-09-22 15:23:24 +00:00
|object Webjars {
|$fields
|}
|""".stripMargin
2019-07-17 20:03:10 +00:00
IO.write(target, content)
Seq(target)
}
def packageTools(logger: Logger, dir: File, version: String): Seq[File] = {
2020-07-30 18:32:04 +00:00
val target = dir / "target"
IO.delete(target)
IO.createDirectory(target)
2021-08-19 06:50:30 +00:00
val archive = target / s"docspell-tools-$version.zip"
logger.info(s"Packaging tools to $archive ...")
2020-07-30 18:32:04 +00:00
val webext = target / "docspell-firefox-extension.xpi"
2021-09-22 15:23:24 +00:00
val wx = dir / "webextension"
2020-07-30 18:32:04 +00:00
IO.zip(
Seq(
wx / "_locales/de/messages.json" -> "_locales/de/messages.json",
wx / "_locales/en/messages.json" -> "_locales/en/messages.json",
2021-09-22 15:23:24 +00:00
wx / "docspell.js" -> "docspell.js",
wx / "icons" / "logo-48.png" -> "icons/logo-48.png",
wx / "icons" / "logo-96.png" -> "icons/logo-96.png",
wx / "manifest.json" -> "manifest.json"
2020-07-30 18:32:04 +00:00
),
2021-03-10 18:48:56 +00:00
webext,
None
2020-07-30 18:32:04 +00:00
)
val excludes = Seq(wx, target)
val files =
(dir ** "*")
.filter(f => !excludes.exists(p => f.absolutePath.startsWith(p.absolutePath)))
.pair(sbt.io.Path.relativeTo(dir))
2021-08-19 06:50:30 +00:00
.map { case (f, name) => (f, s"docspell-tools-$version/$name") }
2020-07-30 18:32:04 +00:00
IO.zip(
Seq(
2021-08-19 06:50:30 +00:00
webext -> s"docspell-tools-$version/firefox/docspell-extension.xpi",
wx / "native/app_manifest.json" -> s"docspell-tools-$version/firefox/native/app_manifest.json",
wx / "native/native.py" -> s"docspell-tools-$version/firefox/native/native.py"
) ++ files,
2021-03-10 18:48:56 +00:00
archive,
None
2020-07-30 18:32:04 +00:00
)
Seq(archive)
}
// --- aliases
2020-07-30 18:32:04 +00:00
addCommandAlias(
"make",
";set webapp/elmCompileMode := ElmCompileMode.Production; set webapp/stylesMode := StylesMode.Prod ;root/openapiCodegen ;root/Test/compile"
2020-07-30 18:32:04 +00:00
)
2021-05-30 22:59:01 +00:00
addCommandAlias("make-zip", ";restserver/Universal/packageBin ;joex/Universal/packageBin")
addCommandAlias("make-deb", ";restserver/Debian/packageBin ;joex/Debian/packageBin")
addCommandAlias("make-tools", ";root/toolsPackage")
addCommandAlias("make-pkg", ";clean ;make ;make-zip ;make-deb")
2021-04-10 15:16:01 +00:00
addCommandAlias("ci", "make; lint; test")
addCommandAlias(
"lint",
2021-07-04 08:15:30 +00:00
"restapi/openapiLint; joexapi/openapiLint; headerCheck; scalafmtSbtCheck; scalafmtCheckAll; Compile/scalafix --check; Test/scalafix --check"
)
addCommandAlias(
"fix",
"headerCreateAll; Compile/scalafix; Test/scalafix; scalafmtSbt; scalafmtAll"
2021-04-10 15:16:01 +00:00
)
addCommandAlias("make-website", ";website/clean ;website/zolaBuild ;website/zolaCheck")
addCommandAlias("publish-website", "website/publishToGitHubPages")