mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-21 09:58:26 +00:00
Initial version.
Features: - Upload PDF files let them analyze - Manage meta data and items - See processing in webapp
This commit is contained in:
217
build.sbt
217
build.sbt
@ -1,39 +1,43 @@
|
||||
import com.github.eikek.sbt.openapi._
|
||||
import scala.sys.process._
|
||||
import com.typesafe.sbt.SbtGit.GitKeys._
|
||||
import docspell.build._
|
||||
|
||||
val sharedSettings = Seq(
|
||||
organization := "com.github.eikek",
|
||||
scalaVersion := "2.13.0",
|
||||
scalaVersion := "2.13.1",
|
||||
scalacOptions ++= Seq(
|
||||
"-deprecation",
|
||||
"-encoding", "UTF-8",
|
||||
"-language:higherKinds",
|
||||
"-language:postfixOps",
|
||||
"-feature",
|
||||
"-Xfatal-warnings", // fail when there are warnings
|
||||
"-Werror", // fail when there are warnings
|
||||
"-unchecked",
|
||||
"-Xlint",
|
||||
"-Xlint:_",
|
||||
"-Ywarn-dead-code",
|
||||
"-Ywarn-numeric-widen",
|
||||
"-Ywarn-value-discard"
|
||||
),
|
||||
scalacOptions in (Compile, console) := Seq()
|
||||
scalacOptions in (Compile, console) :=
|
||||
(scalacOptions.value.filter(o => !o.contains("Xlint")) ++ Seq("-Xlint:_,-unused")),
|
||||
scalacOptions in (Test, console) :=
|
||||
(scalacOptions.value.filter(o => !o.contains("Xlint")) ++ Seq("-Xlint:_,-unused"))
|
||||
)
|
||||
|
||||
val testSettings = Seq(
|
||||
testFrameworks += new TestFramework("minitest.runner.Framework"),
|
||||
libraryDependencies ++= Dependencies.miniTest
|
||||
libraryDependencies ++= Dependencies.miniTest ++ Dependencies.logging.map(_ % Test)
|
||||
)
|
||||
|
||||
val elmSettings = Seq(
|
||||
Compile/resourceGenerators += (Def.task {
|
||||
Compile/resourceGenerators += Def.task {
|
||||
compileElm(streams.value.log
|
||||
, (Compile/baseDirectory).value
|
||||
, (Compile/resourceManaged).value
|
||||
, name.value
|
||||
, version.value)
|
||||
}).taskValue,
|
||||
}.taskValue,
|
||||
watchSources += Watched.WatchSource(
|
||||
(Compile/sourceDirectory).value/"elm"
|
||||
, FileFilter.globFilter("*.elm")
|
||||
@ -42,14 +46,14 @@ val elmSettings = Seq(
|
||||
)
|
||||
|
||||
val webjarSettings = Seq(
|
||||
Compile/resourceGenerators += (Def.task {
|
||||
Compile/resourceGenerators += Def.task {
|
||||
copyWebjarResources(Seq((sourceDirectory in Compile).value/"webjar")
|
||||
, (Compile/resourceManaged).value
|
||||
, name.value
|
||||
, version.value
|
||||
, streams.value.log
|
||||
)
|
||||
}).taskValue,
|
||||
}.taskValue,
|
||||
watchSources += Watched.WatchSource(
|
||||
(Compile / sourceDirectory).value/"webjar"
|
||||
, FileFilter.globFilter("*.js") || FileFilter.globFilter("*.css")
|
||||
@ -57,7 +61,7 @@ val webjarSettings = Seq(
|
||||
)
|
||||
)
|
||||
|
||||
val debianSettings = Seq(
|
||||
def debianSettings(cfgFile: String) = Seq(
|
||||
maintainer := "Eike Kettner <eike.kettner@posteo.de>",
|
||||
packageSummary := description.value,
|
||||
packageDescription := description.value,
|
||||
@ -66,9 +70,9 @@ val debianSettings = Seq(
|
||||
if (!conf.exists) {
|
||||
sys.error(s"File $conf not found")
|
||||
}
|
||||
conf -> "conf/docspell.conf"
|
||||
conf -> s"conf/$cfgFile.conf"
|
||||
},
|
||||
bashScriptExtraDefines += """addJava "-Dconfig.file=${app_home}/../conf/docspell.conf""""
|
||||
bashScriptExtraDefines += s"""addJava "-Dconfig.file=$${app_home}/../conf/$cfgFile.conf""""
|
||||
)
|
||||
|
||||
val buildInfoSettings = Seq(
|
||||
@ -77,7 +81,47 @@ val buildInfoSettings = Seq(
|
||||
buildInfoOptions += BuildInfoOption.BuildTime
|
||||
)
|
||||
|
||||
val openapiScalaSettings = Seq(
|
||||
openapiScalaConfig := ScalaConfig().withJson(ScalaJson.circeSemiauto).
|
||||
addMapping(CustomMapping.forType({
|
||||
case TypeDef("LocalDateTime", _) =>
|
||||
TypeDef("Timestamp", Imports("docspell.common.Timestamp"))
|
||||
})).
|
||||
addMapping(CustomMapping.forFormatType({
|
||||
case "ident" => field =>
|
||||
field.copy(typeDef = TypeDef("Ident", Imports("docspell.common.Ident")))
|
||||
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")))
|
||||
}))
|
||||
)
|
||||
|
||||
val reStartSettings = Seq(
|
||||
javaOptions in reStart ++= Seq(s"-Dconfig.file=${(LocalRootProject/baseDirectory).value/"dev.conf"}")
|
||||
)
|
||||
|
||||
// --- Modules
|
||||
|
||||
val common = project.in(file("modules/common")).
|
||||
settings(sharedSettings).
|
||||
@ -85,7 +129,10 @@ val common = project.in(file("modules/common")).
|
||||
settings(
|
||||
name := "docspell-common",
|
||||
libraryDependencies ++=
|
||||
Dependencies.fs2
|
||||
Dependencies.fs2 ++
|
||||
Dependencies.circe ++
|
||||
Dependencies.loggingApi ++
|
||||
Dependencies.pureconfig.map(_ % "optional")
|
||||
)
|
||||
|
||||
val store = project.in(file("modules/store")).
|
||||
@ -96,16 +143,31 @@ val store = project.in(file("modules/store")).
|
||||
libraryDependencies ++=
|
||||
Dependencies.doobie ++
|
||||
Dependencies.bitpeace ++
|
||||
Dependencies.tika ++
|
||||
Dependencies.fs2 ++
|
||||
Dependencies.databases ++
|
||||
Dependencies.flyway ++
|
||||
Dependencies.loggingApi
|
||||
)
|
||||
).dependsOn(common)
|
||||
|
||||
val text = project.in(file("modules/text")).
|
||||
enablePlugins(NerModelsPlugin).
|
||||
settings(sharedSettings).
|
||||
settings(testSettings).
|
||||
settings(NerModelsPlugin.nerClassifierSettings).
|
||||
settings(
|
||||
name := "docspell-text",
|
||||
libraryDependencies ++=
|
||||
Dependencies.fs2 ++
|
||||
Dependencies.tika ++
|
||||
Dependencies.stanfordNlpCore
|
||||
).dependsOn(common)
|
||||
|
||||
val restapi = project.in(file("modules/restapi")).
|
||||
enablePlugins(OpenApiSchema).
|
||||
settings(sharedSettings).
|
||||
settings(testSettings).
|
||||
settings(openapiScalaSettings).
|
||||
settings(
|
||||
name := "docspell-restapi",
|
||||
libraryDependencies ++=
|
||||
@ -113,22 +175,21 @@ val restapi = project.in(file("modules/restapi")).
|
||||
openapiTargetLanguage := Language.Scala,
|
||||
openapiPackage := Pkg("docspell.restapi.model"),
|
||||
openapiSpec := (Compile/resourceDirectory).value/"docspell-openapi.yml",
|
||||
openapiScalaConfig := ScalaConfig().withJson(ScalaJson.circeSemiauto)
|
||||
)
|
||||
).dependsOn(common)
|
||||
|
||||
val joexapi = project.in(file("modules/joexapi")).
|
||||
enablePlugins(OpenApiSchema).
|
||||
settings(sharedSettings).
|
||||
settings(testSettings).
|
||||
settings(openapiScalaSettings).
|
||||
settings(
|
||||
name := "docspell-joexapi",
|
||||
libraryDependencies ++=
|
||||
Dependencies.circe,
|
||||
openapiTargetLanguage := Language.Scala,
|
||||
openapiPackage := Pkg("docspell.joexapi.model"),
|
||||
openapiSpec := (Compile/resourceDirectory).value/"joex-openapi.yml",
|
||||
openapiScalaConfig := ScalaConfig().withJson(ScalaJson.circeSemiauto)
|
||||
)
|
||||
openapiSpec := (Compile/resourceDirectory).value/"joex-openapi.yml"
|
||||
).dependsOn(common)
|
||||
|
||||
val joex = project.in(file("modules/joex")).
|
||||
enablePlugins(BuildInfoPlugin
|
||||
@ -137,7 +198,7 @@ val joex = project.in(file("modules/joex")).
|
||||
, SystemdPlugin).
|
||||
settings(sharedSettings).
|
||||
settings(testSettings).
|
||||
settings(debianSettings).
|
||||
settings(debianSettings("docspell-joex")).
|
||||
settings(buildInfoSettings).
|
||||
settings(
|
||||
name := "docspell-joex",
|
||||
@ -147,11 +208,12 @@ val joex = project.in(file("modules/joex")).
|
||||
Dependencies.circe ++
|
||||
Dependencies.pureconfig ++
|
||||
Dependencies.loggingApi ++
|
||||
Dependencies.logging,
|
||||
Dependencies.logging.map(_ % Runtime),
|
||||
addCompilerPlugin(Dependencies.kindProjectorPlugin),
|
||||
addCompilerPlugin(Dependencies.betterMonadicFor),
|
||||
buildInfoPackage := "docspell.joex"
|
||||
).dependsOn(store, joexapi, restapi)
|
||||
buildInfoPackage := "docspell.joex",
|
||||
reStart/javaOptions ++= Seq(s"-Dconfig.file=${(LocalRootProject/baseDirectory).value/"dev.conf"}")
|
||||
).dependsOn(store, text, joexapi, restapi)
|
||||
|
||||
val backend = project.in(file("modules/backend")).
|
||||
settings(sharedSettings).
|
||||
@ -160,7 +222,9 @@ val backend = project.in(file("modules/backend")).
|
||||
name := "docspell-backend",
|
||||
libraryDependencies ++=
|
||||
Dependencies.loggingApi ++
|
||||
Dependencies.fs2
|
||||
Dependencies.fs2 ++
|
||||
Dependencies.bcrypt ++
|
||||
Dependencies.http4sClient
|
||||
).dependsOn(store)
|
||||
|
||||
val webapp = project.in(file("modules/webapp")).
|
||||
@ -183,7 +247,7 @@ val restserver = project.in(file("modules/restserver")).
|
||||
, SystemdPlugin).
|
||||
settings(sharedSettings).
|
||||
settings(testSettings).
|
||||
settings(debianSettings).
|
||||
settings(debianSettings("docspell-server")).
|
||||
settings(buildInfoSettings).
|
||||
settings(
|
||||
name := "docspell-restserver",
|
||||
@ -194,39 +258,122 @@ val restserver = project.in(file("modules/restserver")).
|
||||
Dependencies.yamusca ++
|
||||
Dependencies.webjars ++
|
||||
Dependencies.loggingApi ++
|
||||
Dependencies.logging,
|
||||
Dependencies.logging.map(_ % Runtime),
|
||||
addCompilerPlugin(Dependencies.kindProjectorPlugin),
|
||||
addCompilerPlugin(Dependencies.betterMonadicFor),
|
||||
buildInfoPackage := "docspell.restserver",
|
||||
Compile/sourceGenerators += (Def.task {
|
||||
Compile/sourceGenerators += Def.task {
|
||||
createWebjarSource(Dependencies.webjars, (Compile/sourceManaged).value)
|
||||
}).taskValue,
|
||||
Compile/unmanagedResourceDirectories ++= Seq((Compile/resourceDirectory).value.getParentFile/"templates")
|
||||
}.taskValue,
|
||||
Compile/resourceGenerators += Def.task {
|
||||
copyWebjarResources(Seq((restapi/Compile/resourceDirectory).value/"docspell-openapi.yml")
|
||||
, (Compile/resourceManaged).value
|
||||
, name.value
|
||||
, version.value
|
||||
, streams.value.log)
|
||||
}.taskValue,
|
||||
Compile/unmanagedResourceDirectories ++= Seq((Compile/resourceDirectory).value.getParentFile/"templates"),
|
||||
reStart/javaOptions ++= Seq(s"-Dconfig.file=${(LocalRootProject/baseDirectory).value/"dev.conf"}")
|
||||
).dependsOn(restapi, joexapi, backend, webapp)
|
||||
|
||||
val microsite = project.in(file("modules/microsite")).
|
||||
enablePlugins(MicrositesPlugin).
|
||||
settings(sharedSettings).
|
||||
settings(
|
||||
name := "docspell-microsite",
|
||||
publishArtifact := false,
|
||||
scalacOptions -= "-Yno-imports",
|
||||
scalacOptions ~= { _ filterNot (_ startsWith "-Ywarn") },
|
||||
scalacOptions ~= { _ filterNot (_ startsWith "-Xlint") },
|
||||
scalaVersion := "2.12.9",
|
||||
skip in publish := true,
|
||||
micrositeFooterText := Some(
|
||||
"""
|
||||
|<p>© 2019 <a href="https://github.com/eikek/docspell">Docspell, v{{site.version}}</a></p>
|
||||
|""".stripMargin
|
||||
),
|
||||
micrositeName := "Docspell",
|
||||
micrositeDescription := "Docspell – A Document Organizer",
|
||||
micrositeBaseUrl := "/docspell",
|
||||
micrositeAuthor := "eikek",
|
||||
micrositeGithubOwner := "eikek",
|
||||
micrositeGithubRepo := "docspell",
|
||||
micrositeGitterChannel := false,
|
||||
micrositeFavicons := Seq(microsites.MicrositeFavicon("favicon.png", "96x96")),
|
||||
micrositeShareOnSocial := false,
|
||||
micrositeHighlightLanguages ++= Seq("json", "javascript"),
|
||||
micrositePalette := Map(
|
||||
"brand-primary" -> "#5d000a", // link color
|
||||
"brand-secondary" -> "#172651", //sidebar background
|
||||
"brand-tertiary" -> "#495680", //main brand background
|
||||
"gray-dark" -> "#050913", //header font color
|
||||
"gray" -> "#131f43", //font color
|
||||
"gray-light" -> "#E3E2E3",
|
||||
"gray-lighter" -> "#f8fbff", //body background
|
||||
"white-color" -> "#FFFFFF"),
|
||||
fork in tut := true,
|
||||
scalacOptions in Tut ~= (_.filterNot(Set("-Ywarn-unused-import", "-Ywarn-dead-code", "-Werror"))),
|
||||
resourceGenerators in Tut += Def.task {
|
||||
val conf1 = (resourceDirectory in (restserver, Compile)).value / "reference.conf"
|
||||
val conf2 = (resourceDirectory in (joex, Compile)).value / "reference.conf"
|
||||
val out1 = resourceManaged.value/"main"/"jekyll"/"_includes"/"server.conf"
|
||||
val out2 = resourceManaged.value/"main"/"jekyll"/"_includes"/"joex.conf"
|
||||
streams.value.log.info(s"Copying reference.conf: $conf1 -> $out1, $conf2 -> $out2")
|
||||
IO.write(out1, "{% raw %}\n")
|
||||
IO.append(out1, IO.readBytes(conf1))
|
||||
IO.write(out1, "\n{% endraw %}", append = true)
|
||||
IO.write(out2, "{% raw %}\n")
|
||||
IO.append(out2, IO.readBytes(conf2))
|
||||
IO.write(out2, "\n{% endraw %}", append = true)
|
||||
val oa1 = (resourceDirectory in (restapi, Compile)).value/"docspell-openapi.yml"
|
||||
val oaout = resourceManaged.value/"main"/"jekyll"/"openapi"/"docspell-openapi.yml"
|
||||
IO.copy(Seq(oa1 -> oaout))
|
||||
Seq(out1, out2, oaout)
|
||||
}.taskValue,
|
||||
resourceGenerators in Tut += Def.task {
|
||||
val staticDoc = (restapi/Compile/openapiStaticDoc).value
|
||||
val target = resourceManaged.value/"main"/"jekyll"/"openapi"/"docspell-openapi.html"
|
||||
IO.copy(Seq(staticDoc -> target))
|
||||
Seq(target)
|
||||
}.taskValue,
|
||||
micrositeCompilingDocsTool := WithTut //WithMdoc
|
||||
// mdocIn := sourceDirectory.value / "main" / "tut"
|
||||
)
|
||||
|
||||
val root = project.in(file(".")).
|
||||
settings(sharedSettings).
|
||||
settings(
|
||||
name := "docspell-root"
|
||||
).
|
||||
aggregate(common, store, joexapi, joex, backend, webapp, restapi, restserver)
|
||||
aggregate(common
|
||||
, text
|
||||
, store
|
||||
, joexapi
|
||||
, joex
|
||||
, backend
|
||||
, webapp
|
||||
, restapi
|
||||
, restserver
|
||||
, microsite)
|
||||
|
||||
|
||||
|
||||
// --- helpers
|
||||
|
||||
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.")
|
||||
src.flatMap { dir =>
|
||||
if (dir.isDirectory) {
|
||||
val files = (dir ** "*").filter(_.isFile).get pair Path.relativeTo(dir)
|
||||
files.map { case (f, name) =>
|
||||
val target = targetDir/name
|
||||
logger.info(s"Copy $f -> $target")
|
||||
IO.createDirectories(Seq(target.getParentFile))
|
||||
IO.copy(Seq(f -> target))
|
||||
target
|
||||
}
|
||||
} else {
|
||||
val target = targetDir/dir.name
|
||||
logger.info(s"Copy $dir -> $target")
|
||||
IO.createDirectories(Seq(target.getParentFile))
|
||||
IO.copy(Seq(dir -> target))
|
||||
Seq(target)
|
||||
@ -255,3 +402,9 @@ def createWebjarSource(wj: Seq[ModuleID], out: File): Seq[File] = {
|
||||
IO.write(target, content)
|
||||
Seq(target)
|
||||
}
|
||||
|
||||
|
||||
addCommandAlias("make", ";root/openapiCodegen ;root/test:compile")
|
||||
addCommandAlias("make-zip", ";restserver/universal:packageBin ;joex/universal:packageBin")
|
||||
addCommandAlias("make-deb", ";restserver/debian:packageBin ;joex/debian:packageBin")
|
||||
addCommandAlias("make-pkg", ";make-zip ;make-deb")
|
||||
|
Reference in New Issue
Block a user