search term:

ifdef macro in Scala

Update 2023-10-15: There’s now a better 0.2.0 that I implemented via pre-typer processing.

Rust has an interesting feature called cfg attribute, which is aware of the build configuration at the language level. This lets us write unit test in the same source as the library code like this:

...

#[cfg(test)]
mod tests {
    #[test]
    fn some_test() {
        ...
    }
}

I implemented an experimental @ifdef macro that does something similar.

sbt 1.9.5

Update: ⚠️ sbt 1.9.5 is broken, because it causes Scala compiler to generate wrong class names for anonymous class on lambda. Please refrain from publishing libraries with it while we investigate. See cala/bug#12868 for details.

Hi everyone. On behalf of the sbt project, I’m happy to announce sbt 1.9.5 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.9.5

See 1.9.0 release note for the details on 1.9.x features.

Highlights

tree-sitter-scala 0.20.2

Hi everyone. On behalf of the tree-sitter-scala project, I am happy to announce tree-sitter-scala 0.20.2. The first two segments of the version number comes from the tree-sitter-cli that was used to generate the parser, and the last segment is our actual version number.

About tree-sitter-scala

tree-sitter-scala is a Scala parser in C language, generated using Tree-sitter CLI, and conforming to the Tree-sitter API. Tree-sitter parsers are generally fast, incremental, and robust (ok with partial errors).

automate refactoring with Bazel + Scalafix

about Scalafix

As a code base becomes larger, it’s useful to have language tooling that can perform automatic refactoring. Thankfully, in 2016 Scala Center created Scalafix. In the announcement blog post Ólafur Geirsson wrote:

Scalafix takes care of easy, repetitive and tedious code transformations so you can focus on the changes that truly deserve your attention. In a nutshell, scalafix reads a source file, transforms usage of unsupported features into newer alternatives, and writes the final result back to the original source file.

sbt 1.9.1

Hi everyone. On behalf of the sbt project, I’m happy to announce sbt 1.9.1 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.9.1

See 1.9.0 release note for the details on 1.9.x features.

Highlights

  • Change of contributor license agreement to Scala CLA, which transfers contribution copyrights to the Scala Center, instead of Lightbend by @julienrf (Julien Richard-Foy is Technical Director at Scala Center) in #7306
  • Publishing related bug fixes following up on sbt 1.9.0, contributed by Adrien Piquerez at Scala Center

tree-sitter-scala 0.20.1

Hi everyone. On behalf of the tree-sitter-scala project, I am happy to announce tree-sitter-scala 0.20.1. The first two segment of the version number comes from the tree-sitter-cli that was used to generate the parser, and the last segment is our actual version number.

About tree-sitter-scala

tree-sitter-scala is a Scala parser in C language, generated using Tree-sitter CLI, and conforming to the Tree-sitter API. Tree-sitter parsers are generally fast, incremental, and robust (ok with partial errors).

sbt 1.9.0

Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.9.0. This is the nineth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.

The headline features of sbt 1.9.0 are:

  • POM consistency of sbt plugin publishing
  • sbt new, a text-based adventure
  • releaseNotesURL setting
  • Deprecation of IntegrationTest configuration

tree-sitter-scala 0.20.0

Hi everyone. On behalf of the tree-sitter-scala project, I am happy to announce tree-sitter-scala 0.20.0. The first two segment of the version number comes from the tree-sitter-cli that was used to generate the parser, and the last segment is our actual version number.

About tree-sitter-scala

tree-sitter-scala is a Scala parser in C language, generated using Tree-sitter CLI, and conforming to the Tree-sitter API. Tree-sitter parsers are generally fast, incremental, and robust (ok with partial errors).

sbt 1.9.0-RC3

Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.9.0-RC2. This is the nineth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.

The headline features of sbt 1.9.0 are:

  • POM consistency of sbt plugin publishing
  • sbt new, a text-based adventure
  • releaseNotesURL setting
  • Deprecation of IntegrationTest configuration

making of a hybrid ScalaMatsuri

A two-day virtual/Tokyo hybrid ScalaMatsuri took place this weekend. Thanks to all the presenters, sponsors, and participants.

Lots of bumps and mishaps for sure, but hopefully it was a successful conference. I join as one of 16 ScalaMatsuri organizers, and also gave a talk and an open-mic session as well.

RFC-3: drop custom config

  • Author: Eugene Yokota
  • Date: 2023-03-26
  • Status: Partially Accepted

In sbt 2.0 ideas I wrote:

idea 3-A: limit dependency configuration to Compile and Test

Here are some more ideas to simplify sbt. sbt generally allows creating of custom dependency configuration, but it doesn’t work well. For the most part, anything that requires custom configuration should likely be handled using separate subproject instead.

problem space

Dependency configuration, such as Compile, Test etc, is a notion directly imported from Apache Ivy’s configuration, which allows custom configurations and extends-relationship among them. The shift in sbt 0.9 embraced configuration and enabled code reuse via inConfig(...)(...). However, generally the custom configuration often requires reimplementation of all tasks, and thus the complete knowledge of the internals.

RFC-2: sbt 2.0 RFC process

  • Author: Eugene Yokota
  • Date: 2023-03-25
  • Status: Implemented

problem space

There are various technical decisions around sbt and Zinc that impact the Scala ecosystem, but currently the process of adding new features or changes to existing feature is not well defined. For the most part, the contributors like Scala Center and I come up with ideas and execute them.

RFC process

At the Tooling Summit in Lausanne this week, Iulian Dragos suggested we adopt “a lightweight process based on RFC (request for comments) docs that can serve as a design document.” In general, it would be a good idea to capture motivations and design intent of major changes.

RFC-1: sbt cache ideas

In sbt 2.0 ideas I wrote:

idea 6: more disk cache and remote cache

Extending the idea of cached compilation in sbt 1.4.0, we should generalize the mechanism so any task can participate in the remote caching.

Here are some more concrete ideas for caching.

problem space

To summarize the general problem space, currently setting up disk caching for tasks is a manual work, so it’s under-utilized. Remote caching is limited to cached compilation.

sbt 2.0 ideas

It’s spring time, and spring makes us hopeful. I’ll be attending Tooling Summit next week, so I think this would be a good time to gather my toughts around sbt 2.

cross build anything with Bazel

Bazel generally prefers monoversioning, in which all targets in the monorepo uses the same version given any library (JUnit or Pandas). Monoversioning greatly reduces the version conflict concerns within the monorepo, and in return enables better code reuse. In practice, monoversioning has a drawback of tying everyone at the hip. If service A, B, C, D, etc are all using Big Framework 1.1, it becomes costly to migrate all to Big Framework 1.2 if there might be a regression. Years would go by, and Big Framework 2.0 might come out, and again, it would be too risky.

sbt 1.8.1

Happy new year! On behalf of the sbt project, I’m happy to announce sbt 1.8.1 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.8.1

See 1.8.0 release note for the details on 1.8.x features.

Highlights

🎄 support Scala Center 🎄

The economic cycle seems to come and go like a slow tide, and sometimes the tech companies also get caught in the middle. Fortunately, Scala seems to be used by some of the leading companies, and although I’ve started using Scala and have been contributing the community mostly for the pure joy of it, time and time again when I was in a bind the Scala community has helped me back by giving me encouragements and career opportunities. I resigned Twitter about a month ago, but I will be more than ok :)

2 years at Twitter

I was a Staff Engineer at Twitter’s Build/Bazel Migration team. After two incredible years, November 17 was my last day (I took the voluntary separation offer and resigned, not that it matters). Twitter has been a special place to work for, for its culture of excellence, diversity, and outpouring of care for all the people that made Flock the Flock. I am grateful that I got the opportunity to experience that firsthand, and be part of it.

image1

Here’s a quick retrospective on my last two years. Info available here are based on publicly available talks and data. Just from our team 10+ members left Twitter after the buyout, so I’ve sprinkled this post with links to their LinkedIn profiles both current and former.

sbt 1.8.0

Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.8.0. This is the eighth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.

Highlights

  • Updates Coursier to 2.1.0-RC1 to address CVE-2022-37866
  • Updates Ivy fork to 2.3.0-sbt-a8f9eb5bf09d0539ea3658a2c2d4e09755b5133e to address CVE-2022-37866
  • Updates scala-xml to 2.x

sbt 1.8.0-RC1

Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.8.0-RC1. This is the eighth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.

Highlights

sbt 1.8.0 is a small release focused on upgrading scala-xml to 2.x. In theory this breaks the binary compatibility in the plugin ecosystem, but in practice there’s already a mixture of both 1.x and 2.x.

If you encounter a conflict in plugins, try putting the following in project/plugins.sbt:

ThisBuild / libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always

sbt 1.7.2

I’m happy to announce sbt 1.7.2 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.7.2

See 1.7.0 release note for the details on 1.7.x features.

Highlights

  • Fixes invalidation of incremental testQuick task #6903 by @gontard
  • Updates sbt new by default to use Giter8 0.15.0
  • Updates launcher to support Scala 3 apps #7035 by @eed3si9n
  • Adds diagnosticCode and diagnosticRelatedInforamation (sic) to InterfaceUtil.problem(...) #7006 by @ckipp01
  • Forwards diagnosticCode to BSP #6998 by @ckipp01

sbt 1.7.0

Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.7.0. This is the seventh feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.

How to upgrade

Download the official sbt runner from cs setup, SDKMAN, or download from https://github.com/sbt/sbt/releases/tag/v1.7.0.

The sbt version used for your build is upgraded by putting the following in project/build.properties:

sbt.version=1.7.0

This mechanism allows that sbt 1.7.0 is used only for the builds that you want.

scopt 4.1.0

scopt 4.1.0 is released. To try new scopt 4.1.0:

libraryDependencies += "com.github.scopt" %% "scopt" % "4.1.0"

scopt 4.1.0 is cross published to the following build matrix:

Scala Version JVM JS (1.x) JS (0.6.x) Native (0.4.x)
3.x n/a
2.13.x
2.12.x
2.11.x

scopt is a little command line options parsing library. See https://eed3si9n.com/scopt4 or readme for the details on how to use scopt.

Eval 0.1.0

I released Eval 0.1.0. Eval evaluates Scala 3 code. It’s a Scala 3 port of Eval class used in sbt.

package example

import com.eed3si9n.eval.Eval
import com.eed3si9n.eval.EvalReporter
import java.nio.file.Paths

@main def main(): Unit =
  val eval = Eval(
    backingDir = Paths.get("/tmp/classes"),
    mkReporter = () => EvalReporter.store
  )
  val result = eval.evalInfer("2")
  println(result.tpe)
  println(result.getValue(this.getClass.getClassLoader))

The above prints:

Int
2

simplifying sbt with common settings

sbt is simple, in a sense that it has a few concepts like settings and tasks, and it achieves a wide variety of things. An idea popped into my head today that could simplify sbt further. I don’t have an implementation on this yet.

granularity of testing

In the context of sbt, Bazel, and likely many other build tools, the term test could encompass various levels, and it’s useful to disamgibuate this, especially when we want to configure pre- and post-hooks and parallel execution. In other words, what do we mean when we say “test”?

There are four levels to test:

  1. test command
  2. test modules
  3. test class
  4. test method/expression

test as commandline interface

The top-most level is the test command that the build tools provide to the users.