Skip to content

Commit e106336

Browse files
committed
WIP update to Scala 2.13.1
1 parent ce2709a commit e106336

File tree

7 files changed

+86
-116
lines changed

7 files changed

+86
-116
lines changed

project/ProjectPlugin.scala

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ object ProjectPlugin extends AutoPlugin {
1919
object autoImport {
2020

2121
object V {
22-
lazy val http4s = "0.20.15"
22+
lazy val http4s = "0.21.0-M6"
2323
lazy val circe = "0.12.3"
2424
lazy val log4s = "1.7.0"
2525
lazy val scalatest = "3.1.0"
@@ -54,18 +54,7 @@ object ProjectPlugin extends AutoPlugin {
5454
Seq(
5555
libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value,
5656
libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value,
57-
libraryDependencies += compilerPlugin(%%("paradise") cross CrossVersion.full),
58-
libraryDependencies ++= {
59-
CrossVersion.partialVersion(scalaVersion.value) match {
60-
// if scala 2.11+ is used, quasiquotes are merged into scala-reflect
61-
case Some((2, scalaMajor)) if scalaMajor >= 11 => Seq()
62-
// in Scala 2.10, quasiquotes are provided by macro paradise
63-
case Some((2, 10)) =>
64-
Seq(
65-
%%("quasiquotes") cross CrossVersion.binary
66-
)
67-
}
68-
}
57+
scalacOptions += "-Ymacro-annotations"
6958
)
7059
}
7160

@@ -123,10 +112,9 @@ object ProjectPlugin extends AutoPlugin {
123112
organizationEmail = "[email protected]"
124113
),
125114
orgLicenseSetting := ApacheLicense,
126-
scalaVersion := "2.12.10",
115+
scalaVersion := "2.13.1",
127116
scalaOrganization := "org.scala-lang",
128117
javacOptions ++= Seq("-encoding", "UTF-8", "-Xlint:-options"),
129-
scalacOptions += "-Ypartial-unification",
130118
fork in Test := false,
131119
parallelExecution in Test := false,
132120
cancelable in Global := true,

server/src/main/scala/org/scalaexercises/evaluator/auth.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ package org.scalaexercises.evaluator
1010
import cats.effect.Sync
1111
import com.typesafe.config._
1212
import org.http4s._
13-
import org.http4s.syntax.kleisli.http4sKleisliResponseSyntax
13+
import org.http4s.syntax.kleisli._
1414
import org.http4s.util._
1515
import org.log4s.getLogger
1616
import pdi.jwt.{Jwt, JwtAlgorithm}

server/src/main/scala/org/scalaexercises/evaluator/evaluation.scala

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,16 @@ import java.net.URLClassLoader
1313
import java.security.MessageDigest
1414
import java.util.jar.JarFile
1515

16-
import cats.effect.{Concurrent, ConcurrentEffect, Timer}
16+
import cats.effect.syntax.concurrent.catsEffectSyntaxConcurrent
17+
import cats.effect.{ConcurrentEffect, Timer}
1718
import cats.implicits._
1819
import coursier._
1920
import coursier.cache.{ArtifactError, FileCache}
2021
import coursier.util.Sync
2122
import org.scalaexercises.evaluator.Eval.CompilerException
23+
import org.scalaexercises.evaluator.{Dependency => EvaluatorDependency}
2224

2325
import scala.concurrent.duration._
24-
import scala.language.reflectiveCalls
2526
import scala.reflect.internal.util.{AbstractFileClassLoader, BatchSourceFile, Position}
2627
import scala.tools.nsc.io.{AbstractFile, VirtualDirectory}
2728
import scala.tools.nsc.reporters._
@@ -41,7 +42,7 @@ class Evaluator[F[_]: Sync](timeout: FiniteDuration = 20.seconds)(
4142

4243
def remoteToRepository(remote: Remote): Repository = MavenRepository(remote)
4344

44-
def dependencyToModule(dependency: Dependency): coursier.Dependency = {
45+
def dependencyToModule(dependency: EvaluatorDependency): Dependency = {
4546
val exclusions: Set[(Organization, ModuleName)] =
4647
dependency.exclusions
4748
.fold(List[(Organization, ModuleName)]())(
@@ -60,7 +61,9 @@ class Evaluator[F[_]: Sync](timeout: FiniteDuration = 20.seconds)(
6061

6162
val cache: FileCache[F] = FileCache[F].noCredentials
6263

63-
def resolveArtifacts(remotes: Seq[Remote], dependencies: Seq[Dependency]): F[Resolution] = {
64+
def resolveArtifacts(
65+
remotes: Seq[Remote],
66+
dependencies: Seq[EvaluatorDependency]): F[Resolution] = {
6467
Resolve[F](cache)
6568
.addDependencies(dependencies.map(dependencyToModule): _*)
6669
.addRepositories(remotes.map(remoteToRepository): _*)
@@ -70,7 +73,7 @@ class Evaluator[F[_]: Sync](timeout: FiniteDuration = 20.seconds)(
7073

7174
def fetchArtifacts(
7275
remotes: Seq[Remote],
73-
dependencies: Seq[Dependency]): F[Either[ArtifactError, List[File]]] =
76+
dependencies: Seq[EvaluatorDependency]): F[Either[ArtifactError, List[File]]] =
7477
for {
7578
resolution <- resolveArtifacts(remotes, dependencies)
7679
gatheredArtifacts <- resolution.artifacts().toList.traverse(cache.file(_).run)
@@ -96,11 +99,12 @@ class Evaluator[F[_]: Sync](timeout: FiniteDuration = 20.seconds)(
9699
}
97100
}
98101

99-
override lazy val compilerMessageHandler: Option[Reporter] = Some(new AbstractReporter {
100-
override val settings: Settings = compilerSettings
101-
override def displayPrompt(): Unit = ()
102-
override def display(pos: Position, msg: String, severity: this.type#Severity): Unit =
102+
override lazy val compilerMessageHandler: Option[Reporter] = Some(new FilteringReporter {
103+
override def settings: Settings = compilerSettings
104+
105+
override def doReport(pos: Position, msg: String, severity: Severity): Unit =
103106
errors += convert((pos, msg, severity.toString))
107+
104108
override def reset() = {
105109
super.reset()
106110
errors = Map.empty
@@ -117,20 +121,20 @@ class Evaluator[F[_]: Sync](timeout: FiniteDuration = 20.seconds)(
117121
Console.withOut(outCapture) {
118122

119123
val result = for {
120-
_ Try(eval.check(code))
121-
result Try(eval.execute[T](code, resetState = true, jars = jars))
124+
_ <- Try(eval.check(code))
125+
result <- Try(eval.execute[T](code, resetState = true, jars = jars))
122126
} yield result
123127

124128
val errors = eval.errors
125129

126130
result match {
127-
case scala.util.Success(r) EvalSuccess[T](errors, r, outCapture.toString)
128-
case scala.util.Failure(t)
131+
case scala.util.Success(r) => EvalSuccess[T](errors, r, outCapture.toString)
132+
case scala.util.Failure(t) =>
129133
t match {
130-
case e: CompilerException CompilationError(errors)
131-
case NonFatal(e)
134+
case e: CompilerException => CompilationError(errors)
135+
case NonFatal(e) =>
132136
EvalRuntimeError(errors, Option(RuntimeError(e, None)))
133-
case e GeneralError(e)
137+
case e => GeneralError(e)
134138
}
135139
}
136140
}
@@ -139,25 +143,18 @@ class Evaluator[F[_]: Sync](timeout: FiniteDuration = 20.seconds)(
139143
def eval[T](
140144
code: String,
141145
remotes: Seq[Remote] = Nil,
142-
dependencies: Seq[Dependency] = Nil
146+
dependencies: Seq[EvaluatorDependency] = Nil
143147
): F[EvalResult[T]] = {
144148
for {
145149
allJars <- fetchArtifacts(remotes, dependencies)
146150
result <- allJars match {
147151
case Right(jars) =>
148-
timeoutTo[EvalResult[T]](F.delay { evaluate(code, jars) }, timeout, Timeout[T](timeout))
152+
F.delay[EvalResult[T]](evaluate(code, jars))
153+
.timeoutTo(timeout, Timeout[T](timeout).asInstanceOf[EvalResult[T]].pure[F])
149154
case Left(fileError) => F.pure(UnresolvedDependency[T](fileError.describe))
150155
}
151156
} yield result
152157
}
153-
154-
def timeoutTo[A](fa: F[A], after: FiniteDuration, fallback: A): F[A] = {
155-
156-
Concurrent[F].race(fa, T.sleep(after)).flatMap {
157-
case Left(a) => a.pure[F]
158-
case Right(_) => fallback.pure[F]
159-
}
160-
}
161158
}
162159

163160
/**
@@ -181,15 +178,15 @@ private class StringCompiler(
181178
val cache = new scala.collection.mutable.HashMap[String, Class[_]]()
182179

183180
trait MessageCollector {
184-
val messages: Seq[List[String]]
181+
val messages: scala.collection.mutable.ListBuffer[List[String]]
185182
}
186183

187-
val reporter = messageHandler getOrElse new AbstractReporter with MessageCollector {
184+
val reporter = messageHandler getOrElse new FilteringReporter with MessageCollector {
188185
val settings = StringCompiler.this.settings
189186
val messages = new scala.collection.mutable.ListBuffer[List[String]]
190187

191-
def display(pos: Position, message: String, severity: Severity) = {
192-
severity.count += 1
188+
def doReport(pos: Position, message: String, severity: Severity) = {
189+
increment(severity)
193190
val severityName = severity match {
194191
case ERROR => "error: "
195192
case WARNING => "warning: "
@@ -211,10 +208,6 @@ private class StringCompiler(
211208
})
212209
}
213210

214-
def displayPrompt = {
215-
// no.
216-
}
217-
218211
override def reset = {
219212
super.reset
220213
messages.clear()
@@ -264,7 +257,7 @@ private class StringCompiler(
264257
// ...and 1/2 this line:
265258
compiler.compileSources(sourceFiles)
266259

267-
if (reporter.hasErrors || reporter.WARNING.count > 0) {
260+
if (reporter.hasErrors || reporter.hasWarnings) {
268261
val msgs: List[List[String]] = reporter match {
269262
case collector: MessageCollector =>
270263
collector.messages.toList

server/src/main/scala/org/scalaexercises/evaluator/services.scala

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,18 @@ import org.http4s._
1717
import org.http4s.dsl._
1818
import org.http4s.headers.Allow
1919
import org.http4s.server.blaze._
20-
import org.http4s.syntax.kleisli.http4sKleisliResponseSyntax
20+
import org.http4s.syntax.kleisli.http4sKleisliResponseSyntaxOptionT
2121
import org.log4s.getLogger
2222
import org.scalaexercises.evaluator.codecs._
2323

2424
import scala.concurrent.duration._
25-
import scala.language.postfixOps
2625

2726
object services {
2827

2928
import EvalResponse.messages._
3029

31-
def evaluatorInstance[F[_]: ConcurrentEffect: ContextShift: Timer: Sync] =
32-
new Evaluator[F](20 seconds)
30+
//def evaluatorInstance[F[_]: ConcurrentEffect: ContextShift: Timer: Sync] =
31+
// new Evaluator[F](20 seconds)
3332

3433
val corsHeaders = Seq(
3534
Header("Vary", "Origin,Access-Control-Request-Methods"),
@@ -116,12 +115,14 @@ object EvaluatorServer extends IOApp {
116115
lazy val port = (Option(System.getenv("PORT")) orElse
117116
Option(System.getProperty("http.port"))).map(_.toInt).getOrElse(8080)
118117

118+
val evaluator = new Evaluator[IO](10.seconds)
119+
119120
override def run(args: List[String]): IO[ExitCode] = {
120121
logger.info(s"Initializing Evaluator at $ip:$port")
121122

122123
BlazeServerBuilder[IO]
123124
.bindHttp(port, ip)
124-
.withHttpApp(auth[IO](service(evaluatorInstance)))
125+
.withHttpApp(auth[IO](service(evaluator)))
125126
.serve
126127
.compile
127128
.lastOrError

server/src/test/scala/org/scalaexercises/evaluator/EvaluatorSpec.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class EvaluatorSpec extends AnyFunSpec with Matchers with Implicits {
2626
.unsafeRunSync()
2727

2828
result should matchPattern {
29-
case EvalSuccess(_, 42, _)
29+
case EvalSuccess(_, 42, _) =>
3030
}
3131
}
3232

@@ -36,7 +36,7 @@ class EvaluatorSpec extends AnyFunSpec with Matchers with Implicits {
3636
.unsafeRunSync()
3737

3838
result should matchPattern {
39-
case EvalSuccess(_, 42, _)
39+
case EvalSuccess(_, 42, _) =>
4040
}
4141
}
4242

@@ -49,7 +49,7 @@ class EvaluatorSpec extends AnyFunSpec with Matchers with Implicits {
4949
.unsafeRunSync()
5050

5151
result should matchPattern {
52-
case Timeout(_)
52+
case Timeout(_) =>
5353
}
5454
}
5555

@@ -69,7 +69,7 @@ Xor.Right(42).toOption.get
6969
.eval(
7070
code,
7171
remotes = remotes,
72-
dependencies = dependencies
72+
dependencies = scalaDependencies(Scala211) ++ dependencies
7373
)
7474
.unsafeRunSync()
7575

0 commit comments

Comments
 (0)