Skip to content

Commit 0cdddd3

Browse files
giacomocavalierinicolasfara
authored andcommitted
fix: fix bug in file lookup
1 parent 9dd391b commit 0cdddd3

File tree

5 files changed

+57
-22
lines changed

5 files changed

+57
-22
lines changed

build.sbt

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ lazy val root = project
5858
"io.circe" %% "circe-core" % "0.14.2",
5959
"io.circe" %% "circe-generic" % "0.14.2",
6060
"io.circe" %% "circe-parser" % "0.14.2",
61-
"org.typelevel" %% "cats-core" % "2.7.0"
61+
"org.typelevel" %% "cats-core" % "2.7.0",
62+
"org.scalatest" %% "scalatest" % "3.2.12" % "test"
6263
),
6364
Global / onLoad := {
6465
val old = (Global / onLoad).value
+26-13
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,33 @@
11
package dev.atedeg
22

33
import scala.util.Try
4+
45
import better.files.File
5-
import io.circe.{Decoder, Json}
6-
import io.circe.generic.auto.*
6+
import io.circe.{ Decoder, Json }
7+
import io.circe.generic.auto._
78
import io.circe.yaml.parser
8-
import cats.implicits.*
9+
import cats.implicits._
10+
11+
import Extensions._
912

1013
final case class Selector(selector: String) {
14+
1115
def toFiles(workingDir: File): Either[String, List[File]] = {
12-
val file = File(workingDir, selector)
13-
Try(
14-
if (file.isDirectory) file.listRecursively.toList.sortBy(_.name)
15-
else if (file.exists) List(file)
16-
else workingDir.glob(selector).toList.sortBy(_.name),
17-
).toEither.leftMap(_.toString)
16+
Try(unsafeToFiles(workingDir))
17+
.map(_.sortBy(_.name))
18+
.toEither
19+
.filterOrElse(_.nonEmpty, s"No files found matching selector $selector")
20+
}
21+
22+
private def unsafeToFiles(workingDir: File): List[File] = {
23+
val dir = File(workingDir, selector)
24+
if (dir.isDirectory) dir.listHtmlFiles.toList
25+
else {
26+
workingDir.listHtmlFiles.find(_.nameWithoutExtension == selector) match {
27+
case Some(f) => List(f)
28+
case None => workingDir.globHtmlFiles(selector).toList
29+
}
30+
}
1831
}
1932
}
2033

@@ -26,12 +39,12 @@ object Configuration {
2639
private val configFile = ".ubidoc"
2740

2841
def read(defaultLocation: File): Either[String, Configuration] =
29-
Try((defaultLocation / configFile).contentAsString).toEither.leftMap(_.toString).flatMap(parse)
42+
Try((defaultLocation / configFile).contentAsString).toEither.flatMap(parse)
3043

31-
def parse(raw: String): Either[String, Configuration] = parser.parse(raw).leftMap(_.toString).flatMap(parseJson)
44+
def parse(raw: String): Either[String, Configuration] = parser.parse(raw).flatMap(parseJson)
3245

3346
private def parseJson(json: Json): Either[String, Configuration] = {
3447
implicit val decoder: Decoder[List[Selector]] = Decoder.decodeList(Decoder.decodeString.map(Selector))
35-
json.as[Configuration].leftMap(_.toString)
48+
json.as[Configuration]
3649
}
37-
}
50+
}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package dev.atedeg
2+
3+
import scala.language.implicitConversions
4+
5+
import better.files.File
6+
import cats.implicits.*
7+
8+
object Extensions {
9+
implicit def eitherToEitherString[A, E](e: Either[E, A]): Either[String, A] = e.leftMap(_.toString)
10+
11+
implicit class BetterFileIterator(val i: Iterator[File]) {
12+
def keepHtmlFiles: Iterator[File] = i.filter(_.isHtmlFile)
13+
}
14+
15+
implicit class BetterFile(val f: File) {
16+
def isHtmlFile: Boolean = f.extension.contains(".html")
17+
def listHtmlFiles: Iterator[File] = f.listRecursively.keepHtmlFiles
18+
def globHtmlFiles(g: String): Iterator[File] = f.glob(g).keepHtmlFiles
19+
}
20+
}

src/main/scala/dev/atedeg/Table.scala

+1-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package dev.atedeg
22

33
import scala.util.Try
44

5-
import dev.atedeg.Selector.toFiles
6-
75
import better.files.File
86
import net.ruippeixotog.scalascraper.browser.JsoupBrowser
97
import better.files.Dsl.SymbolicOperations
@@ -31,7 +29,7 @@ object Table {
3129

3230
def parse(workingDir: File, tableConfig: TableConfig, ignoredFiles: Set[File]): Either[String, (Table, List[File])] =
3331
for {
34-
files <- tableConfig.rows.flatTraverse(toFiles(workingDir, _)).map(_.filterNot(ignoredFiles.contains))
32+
files <- tableConfig.rows.flatTraverse(_.toFiles(workingDir)).map(_.filterNot(ignoredFiles.contains))
3533
rows <- files.traverse(parseFile(_, tableConfig.columns))
3634
columnNames = tableConfig.columns.map(_.name)
3735
} yield (Table(tableConfig.name, columnNames, rows), files)

src/main/scala/dev/atedeg/Ubidoc.scala

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package dev.atedeg
22

3+
import java.io.{ File => JFile }
4+
5+
import scala.util.Try
6+
37
import better.files.{ File, FileExtensions }
48
import cats.implicits.*
59

6-
import java.io.{ File => JFile }
7-
import scala.util.Try
10+
import Extensions._
811

912
object Ubidoc {
1013

@@ -29,10 +32,10 @@ object Ubidoc {
2932
}
3033

3134
def listAllFiles(workingDir: File): Either[String, Set[File]] =
32-
Try(workingDir.listRecursively).toEither.leftMap(_.toString).map(_.toSet)
35+
Try(workingDir.listRecursively).toEither.map(_.toSet)
3336

3437
def getIgnoredFiles(conf: Configuration, workingDir: File): Either[String, Set[File]] =
35-
conf.ignored.flatTraverse(Selector.toFiles(workingDir, _)).map(_.toSet)
38+
conf.ignored.flatTraverse(_.toFiles(workingDir)).map(_.toSet)
3639

3740
def parseAllFiles(
3841
conf: Configuration,
@@ -43,7 +46,7 @@ object Ubidoc {
4346
for {
4447
res <- conf.tables.traverse(Table.parse(workingDir, _, ignoredFiles))
4548
tables = res.map(_._1)
46-
_ <- tables.traverse(_.serialize(targetDir)).toEither.leftMap(_.toString)
49+
_ <- tables.traverse(_.serialize(targetDir)).toEither
4750
files = res.flatMap(_._2)
4851
} yield files.toSet
4952

0 commit comments

Comments
 (0)