From 1d1b810a48b80978995a9ddaa1f8638359484015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastian=20Le=20Merdy?= <567637+seblm@users.noreply.github.com> Date: Mon, 22 May 2023 23:32:44 +0200 Subject: [PATCH] Scala: Update to Scala 3 Also: - use a correct sbt definition file inspired from `sbt new scala/scala3.g8` - define a CI job - check and enforce formatting with scalafmt - reduce differences with Java reference --- .github/workflows/scala.yml | 30 +++++++ expensereport-scala/.gitignore | 2 - expensereport-scala/.scalafmt.conf | 3 + expensereport-scala/Makefile | 2 +- expensereport-scala/README.md | 2 + expensereport-scala/build.sbt | 7 ++ expensereport-scala/project/build.properties | 1 + expensereport-scala/project/plugins.sbt | 1 + .../com/nelkinda/training/ExpenseReport.scala | 82 +++++++++---------- 9 files changed, 86 insertions(+), 44 deletions(-) create mode 100644 .github/workflows/scala.yml create mode 100644 expensereport-scala/.scalafmt.conf create mode 100644 expensereport-scala/README.md create mode 100644 expensereport-scala/project/build.properties create mode 100644 expensereport-scala/project/plugins.sbt diff --git a/.github/workflows/scala.yml b/.github/workflows/scala.yml new file mode 100644 index 00000000..2d8dfe32 --- /dev/null +++ b/.github/workflows/scala.yml @@ -0,0 +1,30 @@ +name: Scala CI + +on: + push: + branches: [ trunk ] + paths: + - 'expensereport-scala/**' + pull_request: + branches: [ trunk ] + paths: + - 'expensereport-scala/**' + +permissions: + contents: read + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: 'sbt' + - run: sbt compile scalafmtCheckAll + working-directory: expensereport-scala + diff --git a/expensereport-scala/.gitignore b/expensereport-scala/.gitignore index 7b205f22..ab056aad 100644 --- a/expensereport-scala/.gitignore +++ b/expensereport-scala/.gitignore @@ -1,4 +1,2 @@ .bsp/ -project/ target/ -*.class diff --git a/expensereport-scala/.scalafmt.conf b/expensereport-scala/.scalafmt.conf new file mode 100644 index 00000000..e547c1ee --- /dev/null +++ b/expensereport-scala/.scalafmt.conf @@ -0,0 +1,3 @@ +maxColumn = 120 +runner.dialect = scala3 +version = 3.7.3 diff --git a/expensereport-scala/Makefile b/expensereport-scala/Makefile index 4ad5457e..f9bc6892 100644 --- a/expensereport-scala/Makefile +++ b/expensereport-scala/Makefile @@ -7,4 +7,4 @@ test: .PHONY: clean clean:: - $(RM) -r project/ target/ + sbt clean diff --git a/expensereport-scala/README.md b/expensereport-scala/README.md new file mode 100644 index 00000000..27adfdde --- /dev/null +++ b/expensereport-scala/README.md @@ -0,0 +1,2 @@ +# Expense Report Scala +Kata for Coding Dojos diff --git a/expensereport-scala/build.sbt b/expensereport-scala/build.sbt index e69de29b..1f571cf5 100644 --- a/expensereport-scala/build.sbt +++ b/expensereport-scala/build.sbt @@ -0,0 +1,7 @@ +lazy val root = project + .in(file(".")) + .settings( + name := "expensereport-scala", + version := "0.1.0-SNAPSHOT", + scalaVersion := "3.2.2", + ) diff --git a/expensereport-scala/project/build.properties b/expensereport-scala/project/build.properties new file mode 100644 index 00000000..72413de1 --- /dev/null +++ b/expensereport-scala/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.8.3 diff --git a/expensereport-scala/project/plugins.sbt b/expensereport-scala/project/plugins.sbt new file mode 100644 index 00000000..83adafa3 --- /dev/null +++ b/expensereport-scala/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") diff --git a/expensereport-scala/src/main/scala/com/nelkinda/training/ExpenseReport.scala b/expensereport-scala/src/main/scala/com/nelkinda/training/ExpenseReport.scala index dd08463e..17a0267e 100644 --- a/expensereport-scala/src/main/scala/com/nelkinda/training/ExpenseReport.scala +++ b/expensereport-scala/src/main/scala/com/nelkinda/training/ExpenseReport.scala @@ -2,44 +2,44 @@ package com.nelkinda.training import java.util.Date -class ExpenseType { -} - -object ExpenseType { - val DINNER = new ExpenseType() - val BREAKFAST = new ExpenseType() - val CAR_RENTAL = new ExpenseType() -} - -class Expense(val `type`: ExpenseType, val amount: Int) - - -class ExpenseReport { - def printReport(expenses: List[Expense]) { - var total = 0 - var mealExpenses = 0 - - println(s"Expense Report: ${new Date()}") - - for (expense <- expenses) { - if (expense.`type` == ExpenseType.DINNER || expense.`type` == ExpenseType.BREAKFAST) { - mealExpenses += expense.amount - } - - var expenseName = expense.`type` match { - case ExpenseType.DINNER => "Dinner" - case ExpenseType.BREAKFAST => "Breakfast" - case ExpenseType.CAR_RENTAL => "Car Rental" - } - - var mealOverExpensesMarker = if (expense.`type` == ExpenseType.DINNER && expense.amount > 5000 || expense.`type` == ExpenseType.BREAKFAST && expense.amount > 1000) "X" else " " - - println(s"${expenseName}\t${expense.amount}\t${mealOverExpensesMarker}") - - total += expense.amount - } - - println(s"Meal Expenses: ${mealExpenses}") - println(s"Total Expenses: ${total}") - } -} +enum ExpenseType: + case DINNER, BREAKFAST, CAR_RENTAL + +class Expense( + val `type`: ExpenseType, + val amount: Int +) + +class ExpenseReport: + def printReport(expenses: List[Expense]): Unit = + var total = 0 + var mealExpenses = 0 + + println("Expenses " + new Date()) + + for (expense <- expenses) + if (expense.`type` == ExpenseType.DINNER || expense.`type` == ExpenseType.BREAKFAST) + mealExpenses += expense.amount + + var expenseName = "" + expense.`type` match + case ExpenseType.DINNER => + expenseName = "Dinner" + case ExpenseType.BREAKFAST => + expenseName = "Breakfast" + case ExpenseType.CAR_RENTAL => + expenseName = "Car Rental" + + val mealOverExpensesMarker = + if ( + expense.`type` == ExpenseType.DINNER && expense.amount > 5000 || + expense.`type` == ExpenseType.BREAKFAST && expense.amount > 1000 + ) "X" + else " " + + println(expenseName + "\t" + expense.amount + "\t" + mealOverExpensesMarker) + + total += expense.amount + + println("Meal expenses: " + mealExpenses) + println("Total expenses: " + total)