Code Formatting with Scalafmt
Paola Pardo
Whether you are starting a Scala project or collaborating in one, here, you have a guide to know the most used frameworks for improving the code style.
Scalastyle and Scalafmt
Scalastyle is a handy tool for coding style in Scala, similar to what Checkstyle does in Java. Scalafmt formats code to look consistent between people on your team, and it is perfectly integrated into your toolchain.
Installation
For the installation, you need to add the following to the plugins.sbt
file under the project folder.
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.2")
addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0")
This will create a Scalastyle configuration under scalastyle_config.xml
. And a file .scalafmt.conf
where you can write rules to maintain consistency across the project.
For example:
# This style is copied from
# <https://github.com/apache/spark/blob/master/dev/.scalafmt.conf> version = "2.7.5"
align = none
align.openParenDefnSite = false
align.openParenCallSite = false
align.tokens = []
optIn = {
configStyleArguments = false
}
danglingParentheses = false
docstrings = JavaDoc
maxColumn = 98
newlines.topLevelStatements = [before,after]
Quickstart
When opening a project that contains a .scalafmt.conf
file, you will be prompted to use it:
Choose the scalafmt formatter, and it will be used at compile-time for formatting files.
However, you can check it manually with:
sbt scalastyle
Alternatively, force code formatting:
sbt scalafmt # Format main sources
sbt test:scalafmt # Format test sources
sbt scalafmtCheck # Check if the scala sources under the project have been formatted
sbt scalafmtSbt # Format *.sbt and project /*.scala files
sbt scalafmtSbtCheck # Check if the files have been formatted by scalafmtSbt
More tricks
Scaladocs
Sbt also checks the format of the Scala docs when publishing the artifacts. The following command will check and generate the Scaladocs:
sbt doc
Header Creation
addSbtPlugin("de.heikoseeberger" % "sbt-header" % "5.6.0")
Include the header you want to show in your build.sbt
headerLicense := Some(HeaderLicense.Custom("Copyright 2021 Qbeast Pills"))
And use it in compile time with:
Compile / compile := (Compile / compile).dependsOn(Compile / headerCheck).value
To automatize the creation of headers in all files, execute:
sbt headerCreate
Using println
Scalafmt has strong policies on print information. And we all debug like this now and then.
The quick solution is to wrap your code:
// scalastyle:off println
<your beautiful piece of code>
// scalastyle:on println
But make sure you delete these comments before pushing any commits 😉
About Qbeast
Qbeast is here to simplify the lives of the Data Engineers and make Data Scientists more agile with fast queries and interactive visualizations. For more information, visit qbeast.io
© 2020 Qbeast. All rights reserved.
Leave a Reply