Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FileOps: implement listFiles to return Seq[Path] #2861

Merged
merged 1 commit into from
Nov 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import java.io.InputStream

import org.scalafmt.Error.MisformattedFile
import org.scalafmt.util.AbsoluteFile
import org.scalafmt.util.FileOps

sealed abstract class InputMethod {
def readInput(options: CliOptions): String
Expand Down Expand Up @@ -64,13 +63,13 @@ object InputMethod {
case class FileContents(file: AbsoluteFile) extends InputMethod {
override def filename = file.path
def readInput(options: CliOptions): String =
FileOps.readFile(filename)(options.encoding)
file.readFile(options.encoding)

override protected def print(text: String, options: CliOptions): Unit =
options.common.out.print(text)

override protected def overwrite(text: String, options: CliOptions): Unit =
FileOps.writeFile(filename, text)(options.encoding)
file.writeFile(text)(options.encoding)

override protected def list(options: CliOptions): Unit = {
val cwd = options.common.workingDirectory.jfile
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ final class AbsoluteFile(val jfile: File) extends AnyVal {
@inline
def isRegularFile: Boolean = FileOps.isRegularFile(asPath)

@inline def listFiles: Seq[AbsoluteFile] = FileOps.listFiles(jfile).map(/)
@inline def listFiles: Seq[AbsoluteFile] = join(FileOps.listFiles(jfile))
@inline def readFile(implicit codec: Codec): String = FileOps.readFile(asPath)
@inline def writeFile(content: String)(implicit codec: Codec): Unit =
FileOps.writeFile(asPath, content)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,24 @@ object FileOps {
def isRegularFile(file: Path): Boolean =
Files.isRegularFile(file, LinkOption.NOFOLLOW_LINKS)

def listFiles(path: String): Vector[String] = {
def listFiles(path: String): Seq[Path] =
listFiles(new File(path))
}

def listFiles(file: File): Vector[String] = {
def listFiles(file: File): Seq[Path] =
if (file.isFile) {
Vector(file.getAbsolutePath)
Seq(file.toPath)
} else {
def listFilesIter(s: File): Iterable[String] = {
def listFilesIter(s: File): Iterable[Path] = {
val (dirs, files) = Option(s.listFiles()).toIterable
.flatMap(_.toIterator)
.partition(_.isDirectory)
files.map(_.getPath) ++ dirs.flatMap(listFilesIter)
files.map(_.toPath) ++ dirs.flatMap(listFilesIter)
}
for {
f0 <- Option(listFilesIter(file)).toVector
filename <- f0
} yield filename
}
}

// TODO(olafur) allow user to specify encoding through CLI.
/** Reads file from file system or from http url.
Expand Down
42 changes: 21 additions & 21 deletions scalafmt-tests/src/test/scala/org/scalafmt/FidelityTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.scalafmt
import scala.meta.dialects.Scala211

import java.io.File
import java.nio.file.Path

import org.scalafmt.config.ScalafmtConfig
import org.scalafmt.util.FileOps
Expand All @@ -15,29 +16,28 @@ import munit.FunSuite
*/
class FidelityTest extends FunSuite with FormatAssertions {

case class TestCase(filename: String, code: String)

object TestCase {

def apply(filename: String): TestCase =
TestCase(filename, FileOps.readFile(filename))
case class TestCase(path: Path, code: String) {
def filename = path.toString
}

val files = FileOps
.listFiles(".")
.filter(_.endsWith(".scala"))
.filterNot(x =>
Set(
"ConfigReader.scala",
"BuildTime.scala",
"GitCommit.scala",
"/target/",
"/resources/",
"/gh-pages/"
).map(_.replace("/", File.separator)).exists(x.contains)
)

val examples = files.map(TestCase.apply)
val examples = {
val denyList = Set(
"ConfigReader.scala",
"BuildTime.scala",
"GitCommit.scala",
"/target/",
"/resources/",
"/gh-pages/"
).map(_.replace("/", File.separator))
FileOps
.listFiles(".")
.filter { x =>
val filename = x.toString
filename.endsWith(".scala") &&
!denyList.exists(filename.contains)
}
.map(x => TestCase(x, FileOps.readFile(x)))
}

examples.foreach { example =>
test(example.filename) {
Expand Down
11 changes: 7 additions & 4 deletions scalafmt-tests/src/test/scala/org/scalafmt/ManualTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ object ManualTests extends HasTests {
lazy val tests: Seq[DiffTest] = {
import FileOps._
val testPrefix = testDir + File.separator
val testFiles = listFiles(testDir).map(x => (x, x.toString))
val manualFiles = for {
filename <- listFiles(testDir) if filename.endsWith(manual)
(path, filename) <- testFiles
if filename.endsWith(manual)
test <- {
readFile(filename).linesIterator
readFile(path).linesIterator
.withFilter(_.startsWith("ONLY"))
.map { name =>
val testPath = stripPrefix(name)
Expand All @@ -35,9 +37,10 @@ object ManualTests extends HasTests {
}
} yield test
val scalaFiles = for {
filename <- listFiles(testDir) if filename.endsWith(".scala")
(path, filename) <- testFiles
if filename.endsWith(".scala")
} yield {
val content = readFile(filename)
val content = readFile(path)
DiffTest(
filename,
filename,
Expand Down
5 changes: 3 additions & 2 deletions scalafmt-tests/src/test/scala/org/scalafmt/UnitTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ object UnitTests extends HasTests {

/** Avoids parsing all files if some tests are marked ONLY.
*/
def getTestFiles: Vector[String] = {
val testsFiles = listFiles(testDir).filter(filename2parse(_).isDefined)
def getTestFiles: Seq[String] = {
val testsFiles =
listFiles(testDir).map(_.toString).filter(filename2parse(_).isDefined)
val onlyTests = testsFiles.filter(_.contains("\n<<< ONLY"))
if (onlyTests.nonEmpty) onlyTests
else testsFiles
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,14 @@ object FileTestOps {
* = Unit } /target/scala-2.11/foo.class ^!*@#@!*#&@*!&#^
*/
def dir2string(file: AbsoluteFile): String = {
val rootPath = file.asPath
val prefix = rootPath.toString
FileOps
.listFiles(file.jfile)
.sorted
.sortBy(_.toString)
.map { path =>
val contents = FileOps.readFile(path)
s"""|${path.stripPrefix(file.jfile.getPath)}
|$contents""".stripMargin
s"""|${path.toString.stripPrefix(prefix)}
|${FileOps.readFile(path)}""".stripMargin
}
.mkString("\n")
.replace(File.separator, "/") // ensure original separators
Expand Down