Skip to content

Commit

Permalink
Scala 3 support (#836)
Browse files Browse the repository at this point in the history
* update build

* update exerices build

* fix compile errors

* reformat and restructure testgen

* port word-count

* remove old test-gens

* fix exercises

* fix sgf, sieve and linked list exercise

* update docs

* update about page
  • Loading branch information
grzegorz-bielski authored Aug 14, 2024
1 parent e58ef7f commit 65e0bec
Show file tree
Hide file tree
Showing 306 changed files with 680 additions and 3,829 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
*.swp
.DS_Store
.idea
.vscode
tmp
target/
bin/configlet
Expand All @@ -13,9 +14,11 @@ bin/configlet.exe
.bloop/
.metals/

project/
project/*
!project/build.properties
!project/plugins.sbt
project/target
src/test/scala/project/
target

generated
9 changes: 9 additions & 0 deletions .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
version = "3.8.2"
align.preset = most
maxColumn = 160
trailingCommas = always
continuationIndent.callSite = 2
continuationIndent.defnSite = 2
runner.dialect = scala3
rewrite.scala3.convertToNewSyntax = yes
rewrite.scala3.removeOptionalBraces = yes
30 changes: 13 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,24 @@ Exercism Exercises in Scala

Please see the [contributing guide](https://github.com/exercism/x-api/blob/master/CONTRIBUTING.md#the-exercise-data)

### Generated Test Suites

Some of the test suites have been generated from shared test data. If a test suite was
generated from test data, then the test suite should not be modified by hand. Instead
the shared test data should be modified, and the generator rerun. To determine if
a test suite generator was used, look inside the `testgen/src/main/scala` directory. The test
suite generators are named in the form `ProblemNameTestGenerator.scala`. Where
`ProblemName` is a close match for the Exercism problem name.
Scala exercises are run by the [scala-test-runner](https://github.com/exercism/scala-test-runner).
It ignores the dependencies listed in the `sbt` files of the exercises. It's important to add all dependencies necessary to run the exercise to the scala-test-runner's dependencies.

[the shared problem metadata](https://github.com/exercism/x-common).
### Generated Test Suites

For example, take a look at the `bob/canonical-data.json` file in the x-common repository, as well
as the following files in the xscala repository:
`testgen` contains a project for generating test suites from [canonical test data](https://github.com/exercism/problem-specifications).

1. `testgen/src/main/scala/BobTestGenerator.scala` - test suite generator for bob
1. `exercises/bob/src/test/scala/BobTest.scala`- generated test suite
You can run it as follows:
```
sbt testgen / run <exercise-slug> <path-to-canonical-data> <optional-path-to-generated-file>
```

Since a generator was used, the`exercises/bob/src/test/scala/BobTest.scala` will never be edited directly.
If there's a missing test case, then additional inputs/outputs should be submitted to the x-common repository.
where:
- `exercise-slug` is the slug of one of the exercises listed in the [config.json](config.json) file.
- `path-to-canonical-data` is a local path to the canonical data, which could be obtained by running `bin/fetch-configlet` and `bin/configlet info -v d`
- `optional-path-to-generated-file` an optional path for the generated file like `./TestSuite.scala`.

When submitting new exercises we encourage that a test suite generator and generated test suite is
included.
Note, that existing iteration of the `testgen` is not _yet_ used.

## Pull Requests

Expand Down
22 changes: 22 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name := "ExcercismScalaTestGenerator"

ThisBuild / scalaVersion := "3.4.2"
ThisBuild / scalacOptions ++= Seq("-source:future")

lazy val root = project
.in(file("."))
.aggregate(testgen)

lazy val testgen = project
.enablePlugins(SbtTwirl)
.settings(
Compile / TwirlKeys.compileTemplates / sourceDirectories
+= (baseDirectory.value.getParentFile / "src" / "main" / "twirl")
)
.settings(
libraryDependencies += "org.playframework" %% "play-json" % "3.0.4",
libraryDependencies += "org.playframework.twirl" %% "twirl-api" % "2.0.7",
libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.4.0",
libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.15.0"
)

5 changes: 4 additions & 1 deletion docs/ABOUT.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
# About

Scala combines object-oriented and functional programming in one concise, high-level language. Scala's static types help avoid bugs in complex applications, and its JVM and JavaScript runtimes let you build high-performance systems with easy access to huge ecosystems of libraries.
Scala is a a programming language that scales with you: from small scripts to large multiplatform applications.

Scala combines object-oriented and functional programming in one concise, high-level language. Scala's static types help avoid bugs in complex applications, and its JVM, JavaScript and Native runtimes let you build high-performance systems with easy access to huge ecosystems of libraries.

* Features
* JVM Interoperability - Scala runs on the JVM, so Java and Scala stacks can be mixed for seamless integration.
* JS and Native interoperability - Scala can run in the browser and on native devices, thanks to [Scala.js](https://www.scala-js.org/) and [Scala Native](https://github.com/scala-native/scala-native)
* Type Inference - Scala is statically typed. However, Scala provides type inference to ease the burden of an advanced type system.
* Object Oriented - Scala is a pure object-oriented language in the sense that every value is an object. Data types and behaviors of objects are described by classes and traits. Class abstractions are extended by subclassing and by a flexible mixin-based composition mechanism to avoid the problems of multiple inheritance.
* Functional - Scala is also a functional language in the sense that every function is a value. Scala provides a lightweight syntax for defining anonymous functions, it supports higher-order functions, it allows functions to be nested, and supports currying. Scala’s case classes and its built-in support for pattern matching model algebraic types used in many functional programming languages. Singleton objects provide a convenient way to group functions that aren’t members of a class.
Expand Down
17 changes: 7 additions & 10 deletions docs/INSTALLATION.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,23 @@
# Installing [Scala](http://www.scala-lang.org)

In addition to the exercism CLI and your favorite text editor, practicing with Exercism exercises in Scala requires few additional tools.

In addition to the exercism CLI and your favorite text editor, practicing with Exercism exercises in Scala requires:
All of them could be installed automatically by the `Coursier` tool.

* Java Development Kit (JDK) 17 or later. Use your preferred vendor or grab one from [Adoptium](https://adoptium.net/)
* [Scala 2.13.x](https://www.scala-lang.org/download/scala2.html)
* [sbt 1.7.x](https://www.scala-sbt.org/download.html)

If you don't want install these various dependencies by hand, consider using [SDKMAN](https://sdkman.io/) to manage your java and java-adjacent development tools and libraries.
See: https://www.scala-lang.org/download/ for more details.

---

After installing Java and `sbt` you will be ready to get started with the Scala track of Exercism.
After running `cs setup` you will be ready to get started with the Scala track of Exercism.

To get started, see "[Running the Tests](https://exercism.org/docs/tracks/scala/tests)".

---

# Scala IDEs

* [IntelliJ IDEA with Scala Plugin](https://www.jetbrains.com/idea/)
* [ScalaIDE](http://scala-ide.org/index.html)
* [NetBeans with Scala Plugin](https://netbeans.org/)
* [Metals with VS Code](https://scalameta.org/metals/docs/editors/vscode)
* [Metals with Vim or Neovim](https://scalameta.org/metals/docs/editors/vim)
* [Metals with Online IDEs such as Gitpod](https://scalameta.org/metals/docs/editors/online-ides)
* [Metals with Zed](https://github.com/scalameta/metals-zed)
* [IntelliJ IDEA with Scala Plugin](https://www.jetbrains.com/idea/)
23 changes: 18 additions & 5 deletions docs/LEARNING.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
# Learning

The best place to start your journey with Scala is the short [Tour of Scala](https://docs.scala-lang.org/tour/tour-of-scala.html) and [Scala Book](https://docs.scala-lang.org/scala3/book/introduction.html)

## Books

* [Programming Scala - Dean Wampler, Ph.D.](http://shop.oreilly.com/product/0636920033073.do)
* [Programming in Scala - Oderksy, Spoon, Venners](http://www.artima.com/shop/programming_in_scala_3ed)
* [Functional Programming in Scala - Chiusano, Bjarnason](https://www.manning.com/books/functional-programming-in-scala)
* [Scala for the Impatient - Cay S. Horstmann](http://horstmann.com/scala/)
* [Programming Scala - Dean Wampler](https://deanwampler.github.io/books/programmingscala.html)
* [Functional Programming in Scala - Michael Pilquist, Rúnar Bjarnason, and Paul Chiusano](https://www.manning.com/books/functional-programming-in-scala-second-edition)
* [Grokking Functional Programming - Michał Płachta](https://www.manning.com/books/grokking-functional-programming)
* [Scala With Cats - Noel Welsh](https://scalawithcats.com/)
* [Hands on Scala Programming - Li Haoyi](https://www.handsonscala.com/)
* [Functional Event-Driven Architecture - Gabriel Volpe](https://leanpub.com/feda)
* [Modern Systems Programming with Scala Native - Richard Whaling](https://www.amazon.com/Modern-Systems-Programming-Scala-Native/dp/1680506226)
* [Scala Cookbook - Alvin Alexander ](https://www.amazon.com/Scala-Cookbook-Object-Oriented-Functional-Programming-dp-1492051543/dp/1492051543)
* [Scala for the Impatient - Cay S. Horstmann](http://horstmann.com/scala/)

## YouTube
- https://www.youtube.com/@DevInsideYou
- https://www.youtube.com/@rockthejvm
- https://www.youtube.com/@Scala-for-Fun-and-Profit
- https://www.youtube.com/@scalaspace


## Online Courses

* [Functional Programming Principles in Scala](https://www.coursera.org/learn/progfun1) - In this course you will discover the elements of the functional programming style and learn how to apply them usefully in your daily programming tasks. You will also develop a solid foundation for reasoning about functional programs, by touching upon proofs of invariants and the tracing of execution symbolically.
* [Functional Program Design in Scala](https://www.coursera.org/learn/progfun2) - In this course you will learn how to apply the functional programming style in the design of larger applications.
You can find a comprehensive list of online courses in [here](https://docs.scala-lang.org/online-courses.html).
18 changes: 13 additions & 5 deletions docs/RESOURCES.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,20 @@
Exercism provides exercises and feedback but can be difficult to jump into for those learning Scala for the first time. These resources can help you get started:

* [Scala - Getting Started](http://www.scala-lang.org/documentation/getting-started.html)
* [StackOverflow](http://stackoverflow.com/)
* [Tour of Scala](https://docs.scala-lang.org/tour/tour-of-scala.html)
* [Scala Book](https://docs.scala-lang.org/scala3/book/introduction.html)
* [Scala.js](https://www.scala-js.org/)
* [Scala Native](https://scala-native.org/)
* [Scala Reddit](https://www.reddit.com/r/scala/)
* [Official Scala Discord](https://discord.com/invite/scala)
* [Official Scala users forum](https://users.scala-lang.org/)
* [StackOverflow](http://stackoverflow.com/questions/tagged/scala)
* [Scala Exercises](https://www.scala-exercises.org/std_lib)
* [The Neophyte's Guide to Scala](https://danielwestheide.com/books/the-neophytes-guide-to-scala/)

## Linting
## Linting and formatting

Scala projects can be linted for further code analysis via a third party tool - [Scalastyle](http://www.scalastyle.org/).

There are several ways of using Scalastyle including Maven, SBT, Gradle, IntelliJ and Eclipse. For instructions on usage visit [Scalastyle](http://www.scalastyle.org/).
- [scalafmt](https://scalameta.org/scalafmt/) - most popular formatting
- [scalafix](https://scalacenter.github.io/scalafix/) - linting and refactoring tool
- [WartRemover](https://www.wartremover.org/) - alternative linting tool
- [sbt-tpolecat](https://github.com/typelevel/sbt-tpolecat) - a set of recommended compiler options with linting and warning in a form of a sbt plugin
12 changes: 9 additions & 3 deletions docs/TESTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ With `sbt` installed, the tests can be executed from the command line with:
$ sbt test
```

You can also use `sbt` to re-run your tests whenever the source files change:
Note that executing the `sbt test` every time will be slow, as it'll re-initializes the `sbt` on each invocation.

`sbt` works like a shell, once it's started you can run commands inside it.

For example, you can use `sbt` to re-run your tests whenever the source files change:
```bash
$ sbt
>~ test
Expand All @@ -16,9 +19,12 @@ $ sbt
Note that all tests have been disabled except the first one for you to work on.
To continue, just remove the `pending` keyword from the beginning of each test case.

Go [here](https://www.scala-sbt.org/) to learn more about the `sbt`.


Tests can also be run within the following IDEs

* [Metals](https://scalameta.org/metals/docs/#running-tests)
* [IntelliJ IDEA with Scala Plugin](https://www.jetbrains.com/idea/)
* [ScalaIDE](http://scala-ide.org/index.html)
* [NetBeans with Scala Plugin](https://netbeans.org/)


4 changes: 2 additions & 2 deletions exercises/concept/basics/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/concept/basics/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/accumulate/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/accumulate/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/acronym/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/acronym/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/all-your-base/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/all-your-base/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/allergies/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/allergies/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/alphametics/build.sbt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.1.0"
1 change: 1 addition & 0 deletions exercises/practice/alphametics/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/anagram/build.sbt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test

1 change: 1 addition & 0 deletions exercises/practice/anagram/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/armstrong-numbers/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/atbash-cipher/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/atbash-cipher/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/bank-account/build.sbt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test

1 change: 1 addition & 0 deletions exercises/practice/bank-account/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/beer-song/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/beer-song/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
8 changes: 5 additions & 3 deletions exercises/practice/binary-search-tree/.meta/Example.scala
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import math.Ordered.orderingToOrdered

case class Bst[+T](value: T, left: Option[Bst[T]], right: Option[Bst[T]]) {
def insert[U >: T <% Ordered[U]](x: U): Bst[U] = {
def insert[U >: T](x: U)(using Ordering[U]): Bst[U] = {
def insert(x: U, node: Option[Bst[U]]): Option[Bst[U]] =
node match {
case Some(n) => Option(n.insert(x))
Expand All @@ -12,7 +14,7 @@ case class Bst[+T](value: T, left: Option[Bst[T]], right: Option[Bst[T]]) {
}

object Bst {
def fromList[T <% Ordered[T]](l: List[T]): Bst[T] = l match {
def fromList[T](l: List[T])(using Ordering[T]): Bst[T] = l match {
case x::xs => xs.foldLeft(Bst(x, None, None))((r, e) => r.insert(e))
case x::Nil => Bst(x, None, None)
case Nil => throw new IllegalArgumentException("Tree must not be empty")
Expand All @@ -26,4 +28,4 @@ object Bst {
}

def apply[T](x: T): Bst[T] = Bst(x, None, None)
}
}
4 changes: 2 additions & 2 deletions exercises/practice/binary-search-tree/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
1 change: 1 addition & 0 deletions exercises/practice/binary-search/.meta/Example.scala
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import scala.annotation.tailrec
import scala.math.Ordered.orderingToOrdered

object BinarySearch {
def find[T](seq: Seq[T], value: T)(implicit ord: T => Ordered[T]): Option[Int]
Expand Down
4 changes: 2 additions & 2 deletions exercises/practice/binary-search/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/binary-search/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/binary/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/binary/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/bob/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/bob/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/book-store/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
1 change: 1 addition & 0 deletions exercises/practice/book-store/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.10.1
4 changes: 2 additions & 2 deletions exercises/practice/bowling/build.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
scalaVersion := "2.13.6"
scalaVersion := "3.4.2"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
Loading

0 comments on commit 65e0bec

Please sign in to comment.