Updated following dependencies as they need changes to the code to work properly:

- Scala
- fs2
- http4s
This commit is contained in:
Rehan Mahmood
2023-10-31 14:24:00 -04:00
parent c9ebd15b23
commit 2a39b2f6a6
64 changed files with 224 additions and 150 deletions

View File

@ -19,7 +19,7 @@ final case class AddonArchive(url: LenientUri, name: String, version: String) {
def nameAndVersion: String =
s"$name-$version"
def extractTo[F[_]: Async](
def extractTo[F[_]: Async: Files](
reader: UrlReader[F],
directory: Path,
withSubdir: Boolean = true,
@ -48,7 +48,7 @@ final case class AddonArchive(url: LenientUri, name: String, version: String) {
/** Read meta either from the given directory or extract the url to find the metadata
* file to read
*/
def readMeta[F[_]: Async](
def readMeta[F[_]: Async: Files](
urlReader: UrlReader[F],
directory: Option[Path] = None
): F[AddonMeta] =
@ -58,7 +58,7 @@ final case class AddonArchive(url: LenientUri, name: String, version: String) {
}
object AddonArchive {
def read[F[_]: Async](
def read[F[_]: Async: Files](
url: LenientUri,
urlReader: UrlReader[F],
extractDir: Option[Path] = None
@ -69,7 +69,7 @@ object AddonArchive {
.map(m => addon.copy(name = m.meta.name, version = m.meta.version))
}
def dockerAndFlakeExists[F[_]: Async](
def dockerAndFlakeExists[F[_]: Async: Files](
archive: Either[Path, Stream[F, Byte]]
): F[(Boolean, Boolean)] = {
val files = Files[F]

View File

@ -29,7 +29,7 @@ trait AddonExecutor[F[_]] {
object AddonExecutor {
def apply[F[_]: Async](
def apply[F[_]: Async: Files](
cfg: AddonExecutorConfig,
urlReader: UrlReader[F]
): AddonExecutor[F] =
@ -104,7 +104,7 @@ object AddonExecutor {
} yield result
}
def selectRunner[F[_]: Async](
def selectRunner[F[_]: Async: Files](
cfg: AddonExecutorConfig,
meta: AddonMeta,
addonDir: Path

View File

@ -50,7 +50,7 @@ case class AddonMeta(
* inspecting the archive to return defaults when the addon isn't declaring it in the
* descriptor.
*/
def enabledTypes[F[_]: Async](
def enabledTypes[F[_]: Async: Files](
archive: Either[Path, Stream[F, Byte]]
): F[List[RunnerType]] =
for {
@ -207,7 +207,7 @@ object AddonMeta {
)
}
def findInZip[F[_]: Async](zipFile: Stream[F, Byte]): F[AddonMeta] = {
def findInZip[F[_]: Async: Files](zipFile: Stream[F, Byte]): F[AddonMeta] = {
val logger = docspell.logging.getLogger[F]
val fail: F[AddonMeta] = Async[F].raiseError(
new FileNotFoundException(

View File

@ -10,6 +10,7 @@ import cats.Applicative
import cats.effect._
import cats.syntax.all._
import fs2.Stream
import fs2.io.file.Files
import docspell.addons.runner._
import docspell.common.exec.Env
@ -26,7 +27,9 @@ trait AddonRunner[F[_]] {
}
object AddonRunner {
def forType[F[_]: Async](cfg: AddonExecutorConfig)(rt: RunnerType) =
def forType[F[_]: Async: Files](
cfg: AddonExecutorConfig
)(rt: RunnerType): AddonRunner[F] =
rt match {
case RunnerType.NixFlake => NixFlakeRunner[F](cfg)
case RunnerType.Docker => DockerRunner[F](cfg)
@ -38,9 +41,9 @@ object AddonRunner {
def pure[F[_]: Applicative](result: AddonResult): AddonRunner[F] =
new AddonRunner[F] {
val runnerType = Nil
val runnerType: List[RunnerType] = Nil
def run(logger: Logger[F], env: Env, ctx: Context) =
def run(logger: Logger[F], env: Env, ctx: Context): F[AddonResult] =
Applicative[F].pure(result)
}
@ -50,9 +53,9 @@ object AddonRunner {
case a :: Nil => a
case _ =>
new AddonRunner[F] {
val runnerType = runners.flatMap(_.runnerType).distinct
val runnerType: List[RunnerType] = runners.flatMap(_.runnerType).distinct
def run(logger: Logger[F], env: Env, ctx: Context) =
def run(logger: Logger[F], env: Env, ctx: Context): F[AddonResult] =
Stream
.emits(runners)
.evalTap(r =>

View File

@ -18,7 +18,7 @@ import docspell.common.Duration
import docspell.common.exec._
import docspell.logging.Logger
final class NixFlakeRunner[F[_]: Async](cfg: NixFlakeRunner.Config)
final class NixFlakeRunner[F[_]: Async: Files](cfg: NixFlakeRunner.Config)
extends AddonRunner[F] {
val runnerType = List(RunnerType.NixFlake)
@ -104,7 +104,7 @@ final class NixFlakeRunner[F[_]: Async](cfg: NixFlakeRunner.Config)
}
object NixFlakeRunner {
def apply[F[_]: Async](cfg: AddonExecutorConfig): NixFlakeRunner[F] =
def apply[F[_]: Async: Files](cfg: AddonExecutorConfig): NixFlakeRunner[F] =
new NixFlakeRunner[F](Config(cfg.nixRunner, cfg.nspawn, cfg.runTimeout))
case class Config(

View File

@ -45,7 +45,7 @@ private[addons] object RunnerUtil {
* expected to be relative to the `ctx.baseDir`. Additional arguments and environment
* variables are added as configured in the addon.
*/
def runInContainer[F[_]: Async](
def runInContainer[F[_]: Async: Files](
logger: Logger[F],
cfg: AddonExecutorConfig.NSpawn,
ctx: Context

View File

@ -19,10 +19,12 @@ import docspell.common.Duration
import docspell.common.exec.{Args, Env, SysCmd}
import docspell.logging.Logger
final class TrivialRunner[F[_]: Async](cfg: TrivialRunner.Config) extends AddonRunner[F] {
final class TrivialRunner[F[_]: Async: Files](cfg: TrivialRunner.Config)
extends AddonRunner[F] {
private val sync = Async[F]
private val files = Files[F]
implicit val andMonoid: Monoid[Boolean] = Monoid.instance[Boolean](true, _ && _)
implicit val andMonoid: Monoid[Boolean] =
Monoid.instance[Boolean](emptyValue = true, _ && _)
private val executeBits = PosixPermissions(
OwnerExecute,
@ -34,13 +36,13 @@ final class TrivialRunner[F[_]: Async](cfg: TrivialRunner.Config) extends AddonR
OthersRead
)
val runnerType = List(RunnerType.Trivial)
val runnerType: List[RunnerType] = List(RunnerType.Trivial)
def run(
logger: Logger[F],
env: Env,
ctx: Context
) = {
): F[AddonResult] = {
val binaryPath = ctx.meta.runner
.flatMap(_.trivial)
.map(_.exec)
@ -71,7 +73,7 @@ final class TrivialRunner[F[_]: Async](cfg: TrivialRunner.Config) extends AddonR
}
object TrivialRunner {
def apply[F[_]: Async](cfg: AddonExecutorConfig): TrivialRunner[F] =
def apply[F[_]: Async: Files](cfg: AddonExecutorConfig): TrivialRunner[F] =
new TrivialRunner[F](Config(cfg.nspawn, cfg.runTimeout))
case class Config(nspawn: NSpawn, timeout: Duration)