scala icon indicating copy to clipboard operation
scala copied to clipboard

How to update to scala 2.13 or 3?

Open mrt181 opened this issue 3 years ago • 9 comments

What is needed to update to Scala 2.13 or 3 and make it work with exercism. I am sure someone will do that in a PR but its likely a little more involved than just updating the build.sbt in each exercise? The sbt-test-runner must be updated too? Can you provide some directions?

mrt181 avatar Jun 22 '21 11:06 mrt181

There are a couple of things that need to be done:

ErikSchierboom avatar Jun 22 '21 11:06 ErikSchierboom

I'm guessing this a work in progress?

I downloaded isogram via CLI and the build.sbt was set to scalaVersion := "2.12.8". The Metals extension in vscode reported that 2.12.8 may not work in future versions of Metals and that Scala should be updated to at least 2.12.12. I jumped through some hoops, some of them probably unnecessary, and after being prompted to download/import a couple files the build.sbt was set to scalaVersion := "2.12.14".

I then looked at several previously downloaded Scala exercises and they all had scalaVersion := "2.12.14" already.

Just to inform you that updating the Scala version is appreciated and, at least for the vscode Metals extension, somewhat needed.

bobahop avatar Sep 04 '21 20:09 bobahop

Ideally, we'd upgrade to Scala 3 as that should give us a bit of a performance bump that might actually get the test runner to run within the allotted time. I have no idea how hard it would be to upgrade to Scala 3 though.

ErikSchierboom avatar Sep 07 '21 15:09 ErikSchierboom

Should be pretty easy to update the exercises to work with Scala 3. Just need to update the version numbers in the build.sbt file, and the imports in the test files. Also you need to use sbt version 1.5.x +.

I wrote a blog about it (including some tips for working with IntelliJ) at http://luigip.atwebpages.com/?p=275

This is the script I run to do the above conversions (I don't think the build.properties bit is actually relevant to the downloads but it's something I ran into where it was set by IntelliJ if I tried to import the module before running sbt from the terminal first).

It works in 95% of cases but there are a few odd cases where there are imports of Scalaz or I think the one involving an optics library, that need a bit of manual intervention. Also I remember 1 case where a test used procedure syntax (def xyz {}) which is now deprecated.

#!/usr/bin/env bash
 
# Check we're in a valid directory
if [[ $PWD =~ xercism/scala/.+ ]] ; then
    echo "directory OK"
  else
    echo "invalid directory"; exit 1
fi
 
# build.sbt: Replace scala and scalatest versions
perl -i -0pe 's/scalaVersion :=.*/scalaVersion := "3.0.1"/' build.sbt
perl -i -0pe 's/"scalatest" % "[^"]*"/"scalatest" % "3.2.9"/' build.sbt
 
# build.properties (if supplied): Replace sbt version
if [[ -a project/build.properties ]] ; then
perl -i -0pe 's/sbt\.version=.*/sbt.version=1.5.5/' project/build.properties
echo build.properties updated
fi
 
# test source: Change scalatest imports
filename=$(find src/test/scala/*.scala |head -1)
## FunSuite
perl -i -0pe 's/import org.scalatest.{Matchers, FunSuite}/import org.scalatest.funsuite.AnyFunSuite\nimport org.scalatest.matchers.should.Matchers/' "$filename"
perl -i -0pe 's/import org.scalatest.{FunSuite, Matchers}/import org.scalatest.funsuite.AnyFunSuite\nimport org.scalatest.matchers.should.Matchers/' "$filename"
perl -i -0pe 's/extends FunSuite/extends AnyFunSuite/' "$filename"
## FlatSpec
perl -i -0pe 's/import org.scalatest.{Matchers, FlatSpec}/import org.scalatest.flatspec.AnyFlatSpec\nimport org.scalatest.matchers.should.Matchers/' "$filename"
perl -i -0pe 's/extends FlatSpec/extends AnyFlatSpec/' "$filename"

luigip avatar Oct 14 '21 00:10 luigip

@luigip That sounds great! Would you be willing to submit a PR?

ErikSchierboom avatar Oct 14 '21 06:10 ErikSchierboom

I'm willing to try this.

  • [x] Exercises. Remaining compile warnings (will fix if time):
    • [ ] alphametics - 1 feature, 3 deprecation warnings
    • [ ] armstrong numbers - 1 deprecation warning
    • [ ] binary-search-tree - 1 unreachable match warning
    • [ ] forth - 1 pattern match exhaustivity warning
    • [ ] grade-school - 1 deprecation warning
    • [ ] lens-person - 10 deprecation warnings
    • [ ] linked-list - 6 unchecked runtime types warnings
    • [ ] matching-brackets - 1 pattern match exhaustivity warning
    • [ ] matrix - 1 deprecation warning
    • [ ] nth-prime - 2 deprecation warnings
    • [ ] ocatal - 1 deprecation warning
    • [ ] pangram - 1 deprecation warning
    • [ ] say - 1 deprecation warning
    • [ ] sgf-parsing - 1 pattern match exhaustivity warning
    • [ ] simple-linked-list - 2 unchecked runtime types warnings
    • [ ] spiral-matrix - 1 deprecation warning
    • [ ] trinary - 1 deprecation warning
    • [ ] word-count - 1 deprecation warning
    • [ ] wordy - 1 pattern match exhaustivity warning
  • [ ] Test Generators
  • [x] Docs
  • [ ] scala test-runner project

LarsWestergren avatar Aug 21 '22 09:08 LarsWestergren

@LarsWestergren Thanks a ton!

ErikSchierboom avatar Aug 23 '22 07:08 ErikSchierboom

Hi, I'm planning to start the Scala track and wanted to check if there is any interest in moving forward with this ticket.

asarkar avatar Dec 20 '23 07:12 asarkar

Definitely! I see that you also posted at https://github.com/exercism/scala/pull/734#issuecomment-1868043660, which is great!

ErikSchierboom avatar Jan 02 '24 08:01 ErikSchierboom