From be2d24771e1b1986a1ee90f32e5b3c3d93de2ae0 Mon Sep 17 00:00:00 2001 From: Paillat Date: Fri, 25 Jul 2025 10:17:27 +0200 Subject: [PATCH] First commit --- .gitignore | 32 ++++++++++++++++++++++++++++++++ .scalafix.conf | 11 +++++++++++ .scalafmt.conf | 5 +++++ README.md | 26 ++++++++++++++++++++++++++ build.sbt | 15 +++++++++++++++ img.png | Bin 0 -> 16201 bytes project/build.properties | 1 + project/plugins.sbt | 1 + src/main/resources/hello.txt | 6 ++++++ src/main/scala/Main.scala | 23 +++++++++++++++++++++++ src/test/scala/MySuite.scala | 9 +++++++++ 11 files changed, 129 insertions(+) create mode 100644 .gitignore create mode 100644 .scalafix.conf create mode 100644 .scalafmt.conf create mode 100644 README.md create mode 100644 build.sbt create mode 100644 img.png create mode 100644 project/build.properties create mode 100644 project/plugins.sbt create mode 100644 src/main/resources/hello.txt create mode 100644 src/main/scala/Main.scala create mode 100644 src/test/scala/MySuite.scala diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e79245 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# macOS +.DS_Store + +# sbt specific +dist/* +target/ +lib_managed/ +src_managed/ +project/boot/ +project/plugins/project/ +project/local-plugins.sbt +.history +.ensime +.ensime_cache/ +.sbt-scripted/ +local.sbt + +# Bloop +.bsp + +# VS Code +.vscode/ + +# Metals +.bloop/ +.metals/ +metals.sbt + +# IDEA +.idea +.idea_modules +/.worksheet/ diff --git a/.scalafix.conf b/.scalafix.conf new file mode 100644 index 0000000..b9b6548 --- /dev/null +++ b/.scalafix.conf @@ -0,0 +1,11 @@ +rules = [ + RemoveUnused, + DisableSyntax, + LeakingImplicitClassVal, + NoValInForComprehension, + ProcedureSyntax, + RedundantSyntax, + OrganizeImports, + NoAutoTupling, + ExplicitResultTypes +] \ No newline at end of file diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 0000000..d5a4c81 --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,5 @@ +version = 3.9.8 +runner.dialect = scala3 + +align.preset = more +maxColumn = 120 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..eeaca4e --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# Scala hello world + +This is my take at a hello world in Scala. It prints a colored "Hello, World!" message to the console. + +![](img.png) + +## Usage +This project uses [sbt](https://www.scala-sbt.org/) as the build tool. To run the project, you can use the following command: + +```bash +sbt run +``` + +## Requirements +- [Eclipse Temurin](https://adoptium.net/) or any other JDK 17+ installed on your system +- [sbt](https://www.scala-sbt.org/) for building and running the project +- [Scala](https://www.scala-lang.org/) installed on your system + +## Dependencies +This project uses the following dependencies: +- [Fansi](https://github.com/com-lihaoyi/fansi) for colored output in the console. + +## Linting and Formatting +Since I wanted to learn as most as I could by making this first project, I also setup [scalafmt](https://scalameta.org/scalafmt/) for code formatting and [scalafix](https://scalacenter.github.io/scalafix/) for code linting, not that they would be particularly useful in this context. +## License +This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. \ No newline at end of file diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..bbe28db --- /dev/null +++ b/build.sbt @@ -0,0 +1,15 @@ +val scala3Version = "3.7.1" + +lazy val root = project + .in(file(".")) + .settings( + name := "hello-world-scala", + version := "0.1.0-SNAPSHOT", + scalaVersion := scala3Version, + semanticdbEnabled := true, + scalacOptions += "-Wunused:all", + javaOptions += "-Dfile.encoding=UTF-8", + javaOptions += "-Dstdout.encoding=UTF-8", + javaOptions += "-Dstderr.encoding=UTF-8", + libraryDependencies += "com.lihaoyi" %% "fansi" % "0.5.0" + ) diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba27601aded40d2a77c10409183007b0b7405e2 GIT binary patch literal 16201 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 AWdHyG literal 0 HcmV?d00001 diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000..c02c575 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.11.3 diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 0000000..59ba6d8 --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.14.3") diff --git a/src/main/resources/hello.txt b/src/main/resources/hello.txt new file mode 100644 index 0000000..69b07c9 --- /dev/null +++ b/src/main/resources/hello.txt @@ -0,0 +1,6 @@ +██╗ ██╗███████╗██╗ ██╗ ██████╗ ██╗ ██╗ ██████╗ ██████╗ ██╗ ██████╗ +██║ ██║██╔════╝██║ ██║ ██╔═══██╗ ██║ ██║██╔═══██╗██╔══██╗██║ ██╔══██╗ +███████║█████╗ ██║ ██║ ██║ ██║ ██║ █╗ ██║██║ ██║██████╔╝██║ ██║ ██║ +██╔══██║██╔══╝ ██║ ██║ ██║ ██║ ██║███╗██║██║ ██║██╔══██╗██║ ██║ ██║ +██║ ██║███████╗███████╗███████╗╚██████╔╝ ╚███╔███╔╝╚██████╔╝██║ ██║███████╗██████╔╝ +╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝ ╚═════╝ ╚══╝╚══╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═════╝ \ No newline at end of file diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala new file mode 100644 index 0000000..184e405 --- /dev/null +++ b/src/main/scala/Main.scala @@ -0,0 +1,23 @@ +import fansi.Attr +import fansi.Color +import scala.io.Source + +def colors: List[Attr] = List( + Color.Red, + Color.LightRed, + Color.Yellow, + Color.Green, + Color.Blue, + Color.Magenta +) + +val message: String = Source.fromResource("hello.txt").mkString + +@main def hello(): Unit = { + val splitMessage: Array[String] = message.split("\n") + for (i <- splitMessage.indices) { + val colorIndex = i % colors.length + val coloredLine = colors(colorIndex)(splitMessage(i)) + println(coloredLine) + } +} diff --git a/src/test/scala/MySuite.scala b/src/test/scala/MySuite.scala new file mode 100644 index 0000000..621784d --- /dev/null +++ b/src/test/scala/MySuite.scala @@ -0,0 +1,9 @@ +// For more information on writing tests, see +// https://scalameta.org/munit/docs/getting-started.html +class MySuite extends munit.FunSuite { + test("example test that succeeds") { + val obtained = 42 + val expected = 42 + assertEquals(obtained, expected) + } +}