From 62bd9844ddf28ca90fe988ffca525aef4db65d01 Mon Sep 17 00:00:00 2001 From: eikek Date: Mon, 27 May 2024 20:39:26 +0200 Subject: [PATCH 1/2] Fix test for non-empty sub directory Fixes: #2650 --- .../test/resources/docspell-addon-single-file.zip | Bin 0 -> 415 bytes .../scala/docspell/addons/AddonArchiveTest.scala | 14 ++++++++++++-- .../src/test/scala/docspell/addons/Fixtures.scala | 3 +++ .../scala/docspell/common/util/Directory.scala | 9 +++++---- 4 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 modules/addonlib/src/test/resources/docspell-addon-single-file.zip diff --git a/modules/addonlib/src/test/resources/docspell-addon-single-file.zip b/modules/addonlib/src/test/resources/docspell-addon-single-file.zip new file mode 100644 index 0000000000000000000000000000000000000000..94735d9841fc1f5eb35aaf7703df550eda633002 GIT binary patch literal 415 zcmWIWW@Zs#U|`^2*cP-cV&PkhuBSj=4kH7D5Q7XuN`7*2L26EpZemJGex6=sZcb57d=AVPoE510I+1`lE`w@8+=nVSRgLslCJPExImB ztesv~Umkl~zYTL}{!(FaPjlnN8;nk!?lEF>v!6*+M~O|Hw_oGw332f|JFhHwH0$*T zs~G+*1#`Vmls(F4Kk!^m>yJRtgb5mtt~2ej`m_0Xru~DvGKH-x-a4B3oSon;aCr7= z5f$#7^njaDNyoQMe&{GVGb>eItBH5+)D5|EA2Kc_^Ez!j@0z}DEB~>T+P*EP4Zm@0 zf6kk*P_rsmyVw6g=k~|4YPwIK{y#6FEE)d#i%#7-k!|hMW}8cF3|iBEbB*Dr9Qm_F zo1b^d2Y53w$uZ*!G6`TXFfaf^k6}q8h=nZxSs?+47I*>PtZX11j6fIxqzyraFaQ8{ Cewlm# literal 0 HcmV?d00001 diff --git a/modules/addonlib/src/test/scala/docspell/addons/AddonArchiveTest.scala b/modules/addonlib/src/test/scala/docspell/addons/AddonArchiveTest.scala index 7cd98dcd..b49dbab8 100644 --- a/modules/addonlib/src/test/scala/docspell/addons/AddonArchiveTest.scala +++ b/modules/addonlib/src/test/scala/docspell/addons/AddonArchiveTest.scala @@ -9,7 +9,7 @@ package docspell.addons import cats.effect._ import cats.syntax.option._ -import docspell.common.UrlReader +import docspell.common._ import docspell.logging.TestLoggingConfig import munit._ @@ -42,10 +42,20 @@ class AddonArchiveTest extends CatsEffectSuite with TestLoggingConfig with Fixtu } yield () } + tempDir.test("read archive from zip with yaml only") { dir => + for { + aa <- AddonArchive.read[IO](singleFileAddonUrl, UrlReader.defaultReader[IO], None) + _ = assertEquals(aa.version, "0.7.0") + path <- aa.extractTo(UrlReader.defaultReader[IO], dir) + read <- AddonArchive.read[IO](aa.url, UrlReader.defaultReader[IO], path.some) + _ = assertEquals(aa, read) + } yield () + } + tempDir.test("Read generated addon from path") { dir => AddonGenerator.successAddon("mini-addon").use { addon => for { - archive <- IO(AddonArchive(addon.url, "", "")) + archive <- IO(AddonArchive(addon.url, "test-addon", "0.1.0")) path <- archive.extractTo[IO](UrlReader.defaultReader[IO], dir) read <- AddonArchive.read[IO](addon.url, UrlReader.defaultReader[IO], path.some) diff --git a/modules/addonlib/src/test/scala/docspell/addons/Fixtures.scala b/modules/addonlib/src/test/scala/docspell/addons/Fixtures.scala index f169d3dd..127c74da 100644 --- a/modules/addonlib/src/test/scala/docspell/addons/Fixtures.scala +++ b/modules/addonlib/src/test/scala/docspell/addons/Fixtures.scala @@ -31,6 +31,9 @@ trait Fixtures extends TestLoggingConfig { self: CatsEffectSuite => val miniAddonUrl = LenientUri.fromJava(getClass.getResource("/minimal-addon.zip")) + val singleFileAddonUrl = + LenientUri.fromJava(getClass.getResource("/docspell-addon-single-file.zip")) + val dummyAddonMeta = AddonMeta( meta = diff --git a/modules/common/src/main/scala/docspell/common/util/Directory.scala b/modules/common/src/main/scala/docspell/common/util/Directory.scala index fcde4ebb..8002bc85 100644 --- a/modules/common/src/main/scala/docspell/common/util/Directory.scala +++ b/modules/common/src/main/scala/docspell/common/util/Directory.scala @@ -6,6 +6,7 @@ package docspell.common.util +import cats.data.OptionT import cats.effect._ import cats.syntax.all._ import cats.{Applicative, Monad} @@ -26,10 +27,10 @@ object Directory { (dir :: dirs.toList).traverse_(Files[F].createDirectories(_)) def nonEmpty[F[_]: Files: Sync](dir: Path): F[Boolean] = - List( - Files[F].isDirectory(dir), - Files[F].list(dir).take(1).compile.last.map(_.isDefined) - ).sequence.map(_.forall(identity)) + OptionT + .whenM(Files[F].isDirectory(dir))(Files[F].list(dir).take(1).compile.toList) + .map(_.nonEmpty) + .isDefined def isEmpty[F[_]: Files: Sync](dir: Path): F[Boolean] = nonEmpty(dir).map(b => !b) From 2ca492d6cb6fa91abab40cc540cd311b4ae6ab5b Mon Sep 17 00:00:00 2001 From: eikek Date: Mon, 27 May 2024 20:39:49 +0200 Subject: [PATCH 2/2] Unwrap single directory after unzip is complete --- .../addonlib/src/main/scala/docspell/addons/AddonArchive.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/addonlib/src/main/scala/docspell/addons/AddonArchive.scala b/modules/addonlib/src/main/scala/docspell/addons/AddonArchive.scala index d4a367be..95725c1a 100644 --- a/modules/addonlib/src/main/scala/docspell/addons/AddonArchive.scala +++ b/modules/addonlib/src/main/scala/docspell/addons/AddonArchive.scala @@ -38,9 +38,9 @@ final case class AddonArchive(url: LenientUri, name: String, version: String) { Files[F].createDirectories(target) *> reader(url) .through(Zip[F](logger.some).unzip(glob = glob, targetDir = target.some)) - .evalTap(_ => Directory.unwrapSingle[F](logger, target)) .compile .drain + .flatTap(_ => Directory.unwrapSingle[F](logger, target)) .as(target) } }