Skip to content

Commit ab282e2

Browse files
committed
Removing unnecessary compilerFlags processing
1 parent 228a85c commit ab282e2

File tree

10 files changed

+57
-257
lines changed

10 files changed

+57
-257
lines changed

client/shared/src/main/scala/org/scalaexercises/evaluator/EvaluatorAPI.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ class EvaluatorAPI[F[_]](url: String, authKey: String)(
1414

1515
def evaluates(resolvers: List[String] = Nil,
1616
dependencies: List[Dependency] = Nil,
17-
code: String,
18-
compilerFlags: List[String] = Nil): Free[F, EvaluationResponse[EvalResponse]] =
19-
O.evaluates(url, authKey, resolvers, dependencies, code, compilerFlags)
17+
code: String): Free[F, EvaluationResponse[EvalResponse]] =
18+
O.evaluates(url, authKey, resolvers, dependencies, code)
2019
}

client/shared/src/main/scala/org/scalaexercises/evaluator/api/Evaluator.scala

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
package org.scalaexercises.evaluator.api
77

8-
import org.scalaexercises.evaluator.EvaluatorResponses.EvaluationResponse
9-
import org.scalaexercises.evaluator.{Decoders, Dependency, EvalRequest, EvalResponse}
10-
import org.scalaexercises.evaluator.http.HttpClient
118
import io.circe.generic.auto._
129
import io.circe.syntax._
10+
import org.scalaexercises.evaluator.EvaluatorResponses.EvaluationResponse
11+
import org.scalaexercises.evaluator.http.HttpClient
12+
import org.scalaexercises.evaluator.{Decoders, Dependency, EvalRequest, EvalResponse}
1313

1414
import scala.concurrent.Future
1515

@@ -23,11 +23,10 @@ class Evaluator {
2323
authKey: String,
2424
resolvers: List[String] = Nil,
2525
dependencies: List[Dependency] = Nil,
26-
code: String,
27-
compilerFlags: List[String] = Nil): Future[EvaluationResponse[EvalResponse]] =
26+
code: String): Future[EvaluationResponse[EvalResponse]] =
2827
httpClient.post[EvalResponse](
2928
url = url,
3029
secretKey = authKey,
31-
data = EvalRequest(resolvers, dependencies, code, compilerFlags).asJson.noSpaces)
30+
data = EvalRequest(resolvers, dependencies, code).asJson.noSpaces)
3231

3332
}

client/shared/src/main/scala/org/scalaexercises/evaluator/free/algebra/EvaluatorOps.scala

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ final case class Evaluates(url: String,
1414
authKey: String,
1515
resolvers: List[String] = Nil,
1616
dependencies: List[Dependency] = Nil,
17-
code: String,
18-
compilerFlags: List[String] = Nil)
17+
code: String)
1918
extends EvaluatorOp[EvaluationResponse[EvalResponse]]
2019

2120
class EvaluatorOps[F[_]](implicit I: Inject[EvaluatorOp, F]) {
@@ -25,11 +24,10 @@ class EvaluatorOps[F[_]](implicit I: Inject[EvaluatorOp, F]) {
2524
authKey: String,
2625
resolvers: List[String] = Nil,
2726
dependencies: List[Dependency] = Nil,
28-
code: String,
29-
compilerFlags: List[String] = Nil
27+
code: String
3028
): Free[F, EvaluationResponse[EvalResponse]] =
3129
Free.inject[EvaluatorOp, F](
32-
Evaluates(url, authKey, resolvers, dependencies, code, compilerFlags))
30+
Evaluates(url, authKey, resolvers, dependencies, code))
3331

3432
}
3533

client/shared/src/main/scala/org/scalaexercises/evaluator/free/interpreters/Interpreter.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ trait Interpreter {
2222
val evaluator = new Evaluator()
2323

2424
def apply[A](fa: EvaluatorOp[A]): Future[A] = fa match {
25-
case Evaluates(url, authKey, resolvers, dependencies, code, compilerFlags)
26-
evaluator.eval(url, authKey, resolvers, dependencies, code, compilerFlags)
25+
case Evaluates(url, authKey, resolvers, dependencies, code)
26+
evaluator.eval(url, authKey, resolvers, dependencies, code)
2727
}
2828

2929
}

server/src/main/resources/application.conf

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,3 @@ eval.auth {
1313
# Loader IO Configuration
1414
loaderio.verificationToken=loaderio-changeme
1515
loaderio.verificationToken=${?LOADERIO_VERIFICATION_TOKEN}
16-
17-
allowed.compiler{
18-
flags = ["-deprecation",
19-
"-encoding", "UTF-8",
20-
"-feature",
21-
"-language:existentials",
22-
"-language:experimental.macros",
23-
"-language:higherKinds",
24-
"-language:implicitConversions",
25-
"-language:reflectiveCalls",
26-
"-unchecked",
27-
"-Xfatal-warnings",
28-
"-Xfuture",
29-
"-Xlint",
30-
"-Xplugin-require:macroparadise",
31-
"-Yinline-warnings",
32-
"-Yliteral-types",
33-
"-Yno-adapted-args",
34-
"-Ywarn-dead-code",
35-
"-Ywarn-numeric-widen",
36-
"-Ywarn-value-discard",
37-
"-Ypartial-unification"]
38-
flags = ${?ALLOWED_COMPILER_FLAGS}
39-
}

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

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class Evaluator(timeout: FiniteDuration = 20.seconds)(
6868
)
6969
} yield artifacts.sequenceU
7070

71-
def createEval(jars: Seq[File], compilerFlags: List[String]) = {
71+
def createEval(jars: Seq[File]) = {
7272
new Eval(jars = jars.toList) {
7373
@volatile var errors: Map[String, List[CompilationInfo]] = Map.empty
7474

@@ -82,8 +82,6 @@ class Evaluator(timeout: FiniteDuration = 20.seconds)(
8282
case None =>
8383
}
8484
}
85-
86-
processArguments(compilerFlags, processAll = true)
8785
}
8886

8987
override lazy val compilerMessageHandler: Option[Reporter] = Some(
@@ -103,10 +101,8 @@ class Evaluator(timeout: FiniteDuration = 20.seconds)(
103101
}
104102
}
105103

106-
private[this] def evaluate[T](code: String,
107-
jars: Seq[File],
108-
compilerFlags: List[String]): EvalResult[T] = {
109-
val eval = createEval(jars, compilerFlags)
104+
private[this] def evaluate[T](code: String, jars: Seq[File]): EvalResult[T] = {
105+
val eval = createEval(jars)
110106

111107
val result = for {
112108
_ Try(eval.check(code))
@@ -130,15 +126,14 @@ class Evaluator(timeout: FiniteDuration = 20.seconds)(
130126
def eval[T](
131127
code: String,
132128
remotes: Seq[Remote] = Nil,
133-
dependencies: Seq[Dependency] = Nil,
134-
compilerFlags: List[String] = Nil
129+
dependencies: Seq[Dependency] = Nil
135130
): Task[EvalResult[T]] = {
136131
for {
137132
allJars <- fetchArtifacts(remotes, dependencies)
138133
result <- allJars match {
139134
case \/-(jars) =>
140135
Task({
141-
evaluate(code, jars, compilerFlags)
136+
evaluate(code, jars)
142137
}).timed(timeout)
143138
.handle({
144139
case err: TimeoutException => Timeout[T](timeout)

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

Lines changed: 39 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@
55

66
package org.scalaexercises.evaluator
77

8-
import com.typesafe.config.ConfigFactory
9-
import io.circe.Decoder
108
import monix.execution.Scheduler
119
import org.http4s._
1210
import org.http4s.dsl._
1311
import org.http4s.server.blaze._
1412
import org.log4s.getLogger
1513

16-
import scala.collection.JavaConversions._
1714
import scala.concurrent.duration._
1815
import scala.language.postfixOps
1916

@@ -25,17 +22,6 @@ object services {
2522

2623
private val logger = getLogger
2724

28-
val config = ConfigFactory.load()
29-
30-
val AllowedCompilerFlags = "allowed.compiler.flags"
31-
32-
val allowedCompilerFlags = if (config.hasPath(AllowedCompilerFlags)) {
33-
config.getStringList(AllowedCompilerFlags).toList
34-
} else {
35-
throw new IllegalStateException(
36-
"Missing -D allowed.compiler.flags=[YOUR_KEY_HERE] or env var [ALLOWED_COMPILER_FLAGS]")
37-
}
38-
3925
implicit val scheduler: Scheduler = Scheduler.io("scala-evaluator")
4026

4127
val evaluator = new Evaluator(20 seconds)
@@ -53,80 +39,47 @@ object services {
5339
auth(HttpService {
5440
case req @ POST -> Root / "eval" =>
5541
import io.circe.syntax._
56-
57-
val decoder: EntityDecoder[EvalRequest] = {
58-
implicit val evalRequestDecoder: Decoder[EvalRequest] =
59-
Decoder.instance {
60-
cursor =>
61-
for {
62-
resolvers <- cursor.downField("resolvers").as[List[String]]
63-
dependencies <- cursor
64-
.downField("dependencies")
65-
.as[List[Dependency]]
66-
code <- cursor.downField("code").as[String]
67-
compilerFlags <- cursor
68-
.downField("compilerFlags")
69-
.as[Option[List[String]]]
70-
} yield
71-
EvalRequest(
72-
resolvers,
73-
dependencies,
74-
code,
75-
compilerFlags.getOrElse(Nil))
76-
}
77-
78-
jsonDecoderOf(evalRequestDecoder)
79-
}
80-
8142
req
82-
.decodeWith[EvalRequest](decoder, strict = false) {
43+
.decode[EvalRequest] {
8344
evalRequest =>
84-
val (validCompilerFlags, invalidCompilerFlags) =
85-
evalRequest.compilerFlags.partition(
86-
allowedCompilerFlags.contains(_))
87-
if (invalidCompilerFlags.isEmpty) {
88-
evaluator.eval[Any](
89-
code = evalRequest.code,
90-
remotes = evalRequest.resolvers,
91-
dependencies = evalRequest.dependencies,
92-
compilerFlags = validCompilerFlags
93-
) flatMap {
94-
(result: EvalResult[_]) =>
95-
val response = result match {
96-
case EvalSuccess(cis, res, out) =>
97-
EvalResponse(
98-
`ok`,
99-
Option(res.toString),
100-
Option(res.asInstanceOf[AnyRef].getClass.getName),
101-
cis)
102-
case Timeout(_) =>
103-
EvalResponse(`Timeout Exceded`, None, None, Map.empty)
104-
case UnresolvedDependency(msg) =>
105-
EvalResponse(
106-
`Unresolved Dependency` + " : " + msg,
107-
None,
108-
None,
109-
Map.empty)
110-
case EvalRuntimeError(cis, runtimeError) =>
111-
EvalResponse(
112-
`Runtime Error`,
113-
runtimeError map (_.error.getMessage),
114-
runtimeError map (_.error.getClass.getName),
115-
cis)
116-
case CompilationError(cis) =>
117-
EvalResponse(`Compilation Error`, None, None, cis)
118-
case GeneralError(err) =>
119-
EvalResponse(
120-
`Unforeseen Exception`,
121-
None,
122-
None,
123-
Map.empty)
124-
}
125-
Ok(response.asJson)
126-
}
127-
} else
128-
BadRequest(
129-
s"Invalid compiler flags: ${invalidCompilerFlags.mkString(",")}")
45+
evaluator.eval[Any](
46+
code = evalRequest.code,
47+
remotes = evalRequest.resolvers,
48+
dependencies = evalRequest.dependencies
49+
) flatMap {
50+
(result: EvalResult[_]) =>
51+
val response = result match {
52+
case EvalSuccess(cis, res, out) =>
53+
EvalResponse(
54+
`ok`,
55+
Option(res.toString),
56+
Option(res.asInstanceOf[AnyRef].getClass.getName),
57+
cis)
58+
case Timeout(_) =>
59+
EvalResponse(`Timeout Exceded`, None, None, Map.empty)
60+
case UnresolvedDependency(msg) =>
61+
EvalResponse(
62+
`Unresolved Dependency` + " : " + msg,
63+
None,
64+
None,
65+
Map.empty)
66+
case EvalRuntimeError(cis, runtimeError) =>
67+
EvalResponse(
68+
`Runtime Error`,
69+
runtimeError map (_.error.getMessage),
70+
runtimeError map (_.error.getClass.getName),
71+
cis)
72+
case CompilationError(cis) =>
73+
EvalResponse(`Compilation Error`, None, None, cis)
74+
case GeneralError(err) =>
75+
EvalResponse(
76+
`Unforeseen Exception`,
77+
None,
78+
None,
79+
Map.empty)
80+
}
81+
Ok(response.asJson)
82+
}
13083
}
13184
.map((r: Response) => r.putHeaders(corsHeaders: _*))
13285
})

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

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -181,64 +181,5 @@ class EvalEndpointSpec extends FunSpec with Matchers {
181181
`Accept-Ranges`(Nil)).status should be(HttpStatus.Unauthorized)
182182
}
183183

184-
it("evaluates the code when no compilerFlags are provided") {
185-
verifyEvalResponse(
186-
response = serve(
187-
EvalRequest(
188-
code = "{import cats._; Eval.now(42).value}",
189-
resolvers = sonatypeReleases,
190-
dependencies = Dependency("org.typelevel", "cats_2.11", "0.6.0") :: Nil
191-
),
192-
`X-Scala-Eval-Api-Token`(validToken)),
193-
expectedStatus = HttpStatus.Ok,
194-
expectedValue = Some("42"),
195-
expectedMessage = `ok`
196-
)
197-
}
198-
199-
it("evaluates the code when an empty list of compilerFlags is provided") {
200-
verifyEvalResponse(
201-
response = serve(
202-
EvalRequest(
203-
code = "{import cats._; Eval.now(42).value}",
204-
resolvers = sonatypeReleases,
205-
dependencies = Dependency("org.typelevel", "cats_2.11", "0.6.0") :: Nil,
206-
compilerFlags = Nil
207-
),
208-
`X-Scala-Eval-Api-Token`(validToken)),
209-
expectedStatus = HttpStatus.Ok,
210-
expectedValue = Some("42"),
211-
expectedMessage = `ok`
212-
)
213-
}
214-
215-
it("evaluates the code when a list of allowed compilerFlags is provided") {
216-
verifyEvalResponse(
217-
response = serve(
218-
EvalRequest(
219-
code = "{import cats._; Eval.now(42).value}",
220-
resolvers = sonatypeReleases,
221-
dependencies = Dependency("org.typelevel", "cats_2.11", "0.6.0") :: Nil,
222-
compilerFlags = List("-deprecation", "-feature")
223-
),
224-
`X-Scala-Eval-Api-Token`(validToken)),
225-
expectedStatus = HttpStatus.Ok,
226-
expectedValue = Some("42"),
227-
expectedMessage = `ok`
228-
)
229-
}
230-
231-
it("rejects requests with invalid compilerFlags") {
232-
serve(
233-
EvalRequest(
234-
code = "1",
235-
resolvers = Nil,
236-
dependencies = Nil,
237-
compilerFlags = List("-optimise", "-help")
238-
),
239-
`X-Scala-Eval-Api-Token`(validToken)).status should be(
240-
HttpStatus.BadRequest)
241-
}
242-
243184
}
244185
}

0 commit comments

Comments
 (0)