-
-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Compile exercises directly with scalac instead of sbt #31
Changes from 6 commits
37a058b
b7baadf
e74b5fe
8d0eb8f
73c8ec5
5d32812
81ca0a2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,13 @@ | ||
.bsp/ | ||
.idea/ | ||
.vscode/ | ||
.metals/ | ||
.bloop/ | ||
dumps/ | ||
target/ | ||
tests/**/results.json | ||
tests/**/build.log | ||
tests/**/runner.log | ||
tests/**/*.original | ||
tests/**/*.original | ||
project/metals.sbt | ||
project/project |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,36 +24,45 @@ fi | |
slug="$1" | ||
input_dir="${2%/}" | ||
output_dir="${3%/}" | ||
|
||
exercise=$(echo "${slug}" | sed -E 's/(^|-)([a-z])/\U\2/g') | ||
tests_file="${input_dir}/src/test/scala/${exercise}Test.scala" | ||
tests_results_file="${input_dir}/target/test-reports/TEST-${exercise}Test.xml" | ||
original_tests_file="${input_dir}/src/test/scala/${exercise}Test.scala.original" | ||
|
||
test_runner_jar=/opt/test-runner/target/scala-2.13/TestRunner-assembly-0.1.0-SNAPSHOT.jar | ||
|
||
workdir=/tmp/exercise | ||
workdir_target=/tmp/exercise/target | ||
|
||
results_file="${output_dir}/results.json" | ||
build_log_file="${output_dir}/build.log" | ||
runner_log_file="${output_dir}/runner.log" | ||
tests_results_file="${workdir}/test-reports/TEST-${exercise}Test.xml" | ||
|
||
# Create the output directory if it doesn't exist | ||
mkdir -p "${output_dir}" | ||
|
||
echo "${slug}: testing..." | ||
# ensure a clean workdir | ||
rm -rf "${workdir}" | ||
mkdir -p "${workdir}" | ||
mkdir -p "${workdir_target}" | ||
|
||
pushd "${input_dir}" > /dev/null | ||
echo | ||
echo "${slug}: testing..." | ||
|
||
cp "${tests_file}" "${original_tests_file}" | ||
cp -R "${input_dir}"/src "${workdir}" | ||
|
||
# Enable all pending tests | ||
sed -i 's/pending//g' "${tests_file}" | ||
|
||
sbt "set offline := true" test > "${build_log_file}" | ||
sed -i 's/pending//g' "${workdir}"/src/test/scala/* | ||
|
||
# Sanitize the output | ||
sed -i -E '/^\[info\]/d' "${build_log_file}" | ||
# compile source and tests | ||
scalac -classpath "${test_runner_jar}" -d "${workdir_target}" "${workdir}"/src/main/scala/* "${workdir}"/src/test/scala/* &> "${build_log_file}" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would this work for exercises that use one or more libraries? E.g. If it doesn't work, we should do a quick check to see which exercises use libraries and then we can decide what to do (nothing blocking). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Those will only work if those libraries are added to the Does that work with the current code? Given the fact that the docker images are run with network disabled, I assume not, but maybe I missed some piece of the puzzle. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Great! I've just ran a little bash command to try and see which libraries are being used, and this is what I found: "com.github.julien-truffaut" %% "monocle-core" % "2.0.0", If we could ensure that all these libraries work in the test runner, we should be good for now. Would you be interested in doing a follow-up PR to add this? If so, I'd suggest adding new test cases to the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, I can do that. Can you point me to the specific tests we need to support? I would like to have a look at the code and also understand why those libraries are needed in the first place 😄 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure.
|
||
|
||
mv -f "${original_tests_file}" "${tests_file}" | ||
# run tests | ||
scala -classpath "${test_runner_jar}" org.scalatest.tools.Runner -R "${workdir_target}" -u "${workdir}"/test-reports | ||
|
||
popd > /dev/null | ||
# Write the results.json file in the exercism format | ||
java -jar "${test_runner_jar}" "${build_log_file}" "${tests_results_file}" "${results_file}" &> "${runner_log_file}" | ||
|
||
# Write the results.json file | ||
java -jar target/scala-2.12/TestRunner-assembly-0.1.0-SNAPSHOT.jar "${build_log_file}" "${tests_results_file}" "${results_file}" > "${runner_log_file}" | ||
# change workdir back to the original input_dir in the final results file | ||
sed -i "s~${workdir}~${input_dir}~g" "${results_file}" | ||
|
||
echo "${slug}: done" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,14 @@ | ||
import Dependencies._ | ||
|
||
ThisBuild / scalaVersion := "2.12.8" | ||
ThisBuild / scalaVersion := "2.13.6" | ||
ThisBuild / version := "0.1.0-SNAPSHOT" | ||
ThisBuild / organization := "org.exercism" | ||
ThisBuild / organizationName := "exercism" | ||
|
||
lazy val root = (project in file(".")) | ||
.settings( | ||
name := "TestRunner", | ||
libraryDependencies += scalaTest % Test, | ||
libraryDependencies += "org.json" % "json" % "20201115" | ||
// not in the Test scope so that it gets added to the fat jar generated by sbt assembly | ||
libraryDependencies += scalaTest, | ||
libraryDependencies += "org.json" % "json" % "20220320" | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
import sbt._ | ||
|
||
object Dependencies { | ||
lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.1" | ||
lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.2.10" | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
sbt.version=1.4.5 | ||
sbt.version=1.5.7 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,13 @@ | ||
[error] /opt/test-runner/tests/example-empty-file/src/test/scala/ExampleEmptyFileTest.scala:7:5: not found: value Leap | ||
[error] Leap.leapYear(2015) should be (false) | ||
[error] ^ | ||
[error] /opt/test-runner/tests/example-empty-file/src/test/scala/ExampleEmptyFileTest.scala:12:5: not found: value Leap | ||
[error] Leap.leapYear(1996) should be (true) | ||
[error] ^ | ||
[error] /opt/test-runner/tests/example-empty-file/src/test/scala/ExampleEmptyFileTest.scala:17:5: not found: value Leap | ||
[error] Leap.leapYear(2100) should be (false) | ||
[error] ^ | ||
[error] /opt/test-runner/tests/example-empty-file/src/test/scala/ExampleEmptyFileTest.scala:22:5: not found: value Leap | ||
[error] Leap.leapYear(2000) should be (true) | ||
[error] ^ | ||
[error] four errors found | ||
[error] (Test / compileIncremental) Compilation failed | ||
[error] Total time: 4 s, completed Apr 14, 2021 2:11:23 PM | ||
/tmp/exercise/src/test/scala/ExampleEmptyFileTest.scala:7: error: not found: value Leap | ||
Leap.leapYear(2015) should be (false) | ||
^ | ||
/tmp/exercise/src/test/scala/ExampleEmptyFileTest.scala:12: error: not found: value Leap | ||
Leap.leapYear(1996) should be (true) | ||
^ | ||
/tmp/exercise/src/test/scala/ExampleEmptyFileTest.scala:17: error: not found: value Leap | ||
Leap.leapYear(2100) should be (false) | ||
^ | ||
/tmp/exercise/src/test/scala/ExampleEmptyFileTest.scala:22: error: not found: value Leap | ||
Leap.leapYear(2000) should be (true) | ||
^ | ||
4 errors |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,49 @@ | ||
[info] Loading project definition from /Users/pro/Exercism/scala/grade-school/project | ||
[info] Loading settings for project grade-school from build.sbt ... | ||
[info] Set current project to grade-school (in build file:/Users/pro/Exercism/scala/grade-school/) | ||
[info] Compiling 1 Scala source to /Users/pro/Exercism/scala/grade-school/target/scala-2.13/test-classes ... | ||
[error] /Users/pro/Exercism/scala/grade-school/src/test/scala/GradeSchoolTest.scala:8:15: overloaded method should with alternatives: | ||
[error] (endWithWord: org.scalatest.words.EndWithWord)(implicit ev: GradeSchoolTest.this.school.DB <:< String): GradeSchoolTest.this.ResultOfEndWithWordForString <and> | ||
[error] (startWithWord: org.scalatest.words.StartWithWord)(implicit ev: GradeSchoolTest.this.school.DB <:< String): GradeSchoolTest.this.ResultOfStartWithWordForString <and> | ||
[error] (includeWord: org.scalatest.words.IncludeWord)(implicit ev: GradeSchoolTest.this.school.DB <:< String): GradeSchoolTest.this.ResultOfIncludeWordForString <and> | ||
[error] (notExist: org.scalatest.words.ResultOfNotExist)(implicit existence: org.scalatest.enablers.Existence[GradeSchoolTest.this.school.DB]): org.scalatest.Assertion <and> | ||
[error] (existWord: org.scalatest.words.ExistWord)(implicit existence: org.scalatest.enablers.Existence[GradeSchoolTest.this.school.DB]): org.scalatest.Assertion <and> | ||
[error] (containWord: org.scalatest.words.ContainWord)org.scalatest.words.ResultOfContainWord[GradeSchoolTest.this.school.DB] <and> | ||
[error] (haveWord: org.scalatest.words.HaveWord)GradeSchoolTest.this.ResultOfHaveWordForExtent[GradeSchoolTest.this.school.DB] <and> | ||
[error] (beWord: org.scalatest.words.BeWord)GradeSchoolTest.this.ResultOfBeWordForAny[GradeSchoolTest.this.school.DB] <and> | ||
[error] (inv: org.scalactic.TripleEqualsSupport.TripleEqualsInvocationOnSpread[GradeSchoolTest.this.school.DB])(implicit ev: Numeric[GradeSchoolTest.this.school.DB]): org.scalatest.Assertion <and> | ||
[error] [U](inv: org.scalactic.TripleEqualsSupport.TripleEqualsInvocation[U])(implicit constraint: org.scalactic.CanEqual[GradeSchoolTest.this.school.DB,U]): org.scalatest.Assertion <and> | ||
[error] (notWord: org.scalatest.words.NotWord)org.scalatest.words.ResultOfNotWordForAny[GradeSchoolTest.this.school.DB] <and> | ||
[error] [TYPECLASS1[_], TYPECLASS2[_]](rightMatcherFactory2: org.scalatest.matchers.MatcherFactory2[GradeSchoolTest.this.school.DB,TYPECLASS1,TYPECLASS2])(implicit typeClass1: TYPECLASS1[GradeSchoolTest.this.school.DB], typeClass2: TYPECLASS2[GradeSchoolTest.this.school.DB]): org.scalatest.Assertion <and> | ||
[error] [TYPECLASS1[_]](rightMatcherFactory1: org.scalatest.matchers.MatcherFactory1[GradeSchoolTest.this.school.DB,TYPECLASS1])(implicit typeClass1: TYPECLASS1[GradeSchoolTest.this.school.DB]): org.scalatest.Assertion <and> | ||
[error] (rightMatcherX1: org.scalatest.matchers.Matcher[GradeSchoolTest.this.school.DB])org.scalatest.Assertion | ||
[error] cannot be applied to (scala.collection.immutable.Map[Nothing,Nothing]) | ||
[error] school.db should (Map()) | ||
[error] ^ | ||
[error] one error found | ||
[error] (Compile / compileIncremental) Compilation failed | ||
[error] Total time: 2 s, completed Feb 21, 2021, 2:37:03 PM | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:8: error: value should is not a member of Map[String,Int] | ||
school.db should be (Map()) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:8: error: not found: value be | ||
school.db should be (Map()) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:14: error: value should is not a member of Map[String,Int] | ||
school.db should be (Map(2 -> Seq("Aimee"))) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:14: error: not found: value be | ||
school.db should be (Map(2 -> Seq("Aimee"))) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:22: error: value should is not a member of Map[String,Int] | ||
school.db should be (Map(2 -> Seq("James", "Blair", "Paul"))) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:22: error: not found: value be | ||
school.db should be (Map(2 -> Seq("James", "Blair", "Paul"))) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:29: error: value should is not a member of Map[String,Int] | ||
school.db should be (Map(3 -> Seq("Chelsea"), 7 -> Seq("Logan"))) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:29: error: not found: value be | ||
school.db should be (Map(3 -> Seq("Chelsea"), 7 -> Seq("Logan"))) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:37: error: value should is not a member of Seq[String] | ||
school.grade(5) should be (Seq("Franklin", "Bradley")) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:37: error: not found: value be | ||
school.grade(5) should be (Seq("Franklin", "Bradley")) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:42: error: value should is not a member of Seq[String] | ||
school.grade(1) should be (Seq()) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:42: error: not found: value be | ||
school.grade(1) should be (Seq()) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:56: error: value should is not a member of Map[Int,Seq[String]] | ||
school.sorted should be (sorted) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:56: error: not found: value be | ||
school.sorted should be (sorted) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:57: error: value should is not a member of List[Int] | ||
school.sorted.keys.toList should be (Seq(3, 4, 6)) | ||
^ | ||
/tmp/exercise/src/test/scala/GradeSchoolTest.scala:57: error: not found: value be | ||
school.sorted.keys.toList should be (Seq(3, 4, 6)) | ||
^ | ||
16 errors |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
scalaVersion := "2.12.8" | ||
scalaVersion := "2.13.6" | ||
|
||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test" | ||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test" |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
scalaVersion := "2.12.8" | ||
scalaVersion := "2.13.6" | ||
|
||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test" | ||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
{"message":"[error] /solution/src/test/scala/ExampleEmptyFileTest.scala:7:5: not found: value Leap\n[error] Leap.leapYear(2015) should be (false)\n[error] ^\n[error] /solution/src/test/scala/ExampleEmptyFileTest.scala:12:5: not found: value Leap\n[error] Leap.leapYear(1996) should be (true)\n[error] ^\n[error] /solution/src/test/scala/ExampleEmptyFileTest.scala:17:5: not found: value Leap\n[error] Leap.leapYear(2100) should be (false)\n[error] ^\n[error] /solution/src/test/scala/ExampleEmptyFileTest.scala:22:5: not found: value Leap\n[error] Leap.leapYear(2000) should be (true)\n[error] ^\n[error] four errors found\n[error] (Test / compileIncremental) Compilation failed\n[error] \n","version":2,"status":"error"} | ||
{"message":"/solution/src/test/scala/ExampleEmptyFileTest.scala:7: error: not found: value Leap\n Leap.leapYear(2015) should be (false)\n ^\n/solution/src/test/scala/ExampleEmptyFileTest.scala:12: error: not found: value Leap\n Leap.leapYear(1996) should be (true)\n ^\n/solution/src/test/scala/ExampleEmptyFileTest.scala:17: error: not found: value Leap\n Leap.leapYear(2100) should be (false)\n ^\n/solution/src/test/scala/ExampleEmptyFileTest.scala:22: error: not found: value Leap\n Leap.leapYear(2000) should be (true)\n ^\n4 errors\n","version":2,"status":"error"} |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
scalaVersion := "2.12.8" | ||
scalaVersion := "2.13.6" | ||
|
||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test" | ||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test" |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
scalaVersion := "2.12.8" | ||
scalaVersion := "2.13.6" | ||
|
||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test" | ||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test" |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
scalaVersion := "2.12.8" | ||
scalaVersion := "2.13.6" | ||
|
||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test" | ||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
{"message":"[error] /solution/src/main/scala/ExampleSyntaxError.scala:1:1: expected class or object definition\n[error] objeTTTWE @#Leap\n[error] ^\n[error] one error found\n[error] (Compile / compileIncremental) Compilation failed\n[error] \n","version":2,"status":"error"} | ||
{"message":"/solution/src/main/scala/ExampleSyntaxError.scala:1: error: expected class or object definition\nobjeTTTWE @#Leap\n^\n1 error\n","version":2,"status":"error"} |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
scalaVersion := "2.13.6" | ||
|
||
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
{"message":"/solution/src/test/scala/GradeSchoolTest.scala:8: error: value should is not a member of Map[String,Int]\n school.db should be (Map())\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:8: error: not found: value be\n school.db should be (Map())\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:14: error: value should is not a member of Map[String,Int]\n school.db should be (Map(2 -> Seq(\"Aimee\")))\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:14: error: not found: value be\n school.db should be (Map(2 -> Seq(\"Aimee\")))\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:22: error: value should is not a member of Map[String,Int]\n school.db should be (Map(2 -> Seq(\"James\", \"Blair\", \"Paul\")))\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:22: error: not found: value be\n school.db should be (Map(2 -> Seq(\"James\", \"Blair\", \"Paul\")))\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:29: error: value should is not a member of Map[String,Int]\n school.db should be (Map(3 -> Seq(\"Chelsea\"), 7 -> Seq(\"Logan\")))\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:29: error: not found: value be\n school.db should be (Map(3 -> Seq(\"Chelsea\"), 7 -> Seq(\"Logan\")))\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:37: error: value should is not a member of Seq[String]\n school.grade(5) should be (Seq(\"Franklin\", \"Bradley\"))\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:37: error: not found: value be\n school.grade(5) should be (Seq(\"Franklin\", \"Bradley\"))\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:42: error: value should is not a member of Seq[String]\n school.grade(1) should be (Seq())\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:42: error: not found: value be\n school.grade(1) should be (Seq())\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:56: error: value should is not a member of Map[Int,Seq[String]]\n school.sorted should be (sorted)\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:56: error: not found: value be\n school.sorted should be (sorted)\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:57: error: value should is not a member of List[Int]\n school.sorted.keys.toList should be (Seq(3, 4, 6))\n ^\n/solution/src/test/scala/GradeSchoolTest.scala:57: error: not found: value be\n school.sorted.keys.toList should be (Seq(3, 4, 6))\n ^\n16 errors\n","version":2,"status":"error"} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
class School { | ||
val db: Map[String, Int] = Map.empty | ||
|
||
def add(name: String, grade: Int): Unit = () | ||
def grade(idx: Int): Seq[String] = Seq.empty | ||
def sorted(): Map[Int, Seq[String]] = Map.empty | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you restore these two lines? These actually run the tests for the Scala test runner project.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sbt assembly
in the Dockerfile already run the tests, so this line causes the tests to be run twice when runnningrun-tests-in-docker.sh
.I have a more generic question: are
run.sh
andrun-tests.sh
supposed to work outside a docker image? If so, both are broken in this PR and I'll investigate. That being said, those files don't seem to work for me outside docker on themain
branch as well.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, I would not have guessed that
sbt assembly
runs the tests too. Then it is fine to omit it here.Ehm, not necessarily. For some tracks, they can. I wouldn't be opposed to a PR that makes them work outside the docker image, but only if it can be done in a somewhat sane way :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would say let's leave it as is for now, then 🤐