Skip to content

Commit afc8738

Browse files
Merge pull request #21 from scala-exercises/jp-evaluator-client-enabling-timeout-options
JP - Allows to specify Conn and Read Timeouts
2 parents ce195bf + b4db604 commit afc8738

File tree

9 files changed

+87
-20
lines changed

9 files changed

+87
-20
lines changed

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

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

66
package org.scalaexercises.evaluator
77

8+
import cats.free.Free
9+
import org.scalaexercises.evaluator.EvaluatorResponses.EvaluationResponse
810
import org.scalaexercises.evaluator.free.algebra.{EvaluatorOp, EvaluatorOps}
911

10-
class EvaluatorAPI(url: String, authKey: String)(
11-
implicit O: EvaluatorOps[EvaluatorOp]) {
12+
import scala.concurrent.duration.Duration
1213

13-
def evaluates(resolvers: List[String] = Nil,
14-
dependencies: List[Dependency] = Nil,
15-
code: String) =
16-
O.evaluates(url, authKey, resolvers, dependencies, code)
14+
class EvaluatorAPI(
15+
url: String,
16+
authKey: String,
17+
connTimeout: Duration,
18+
readTimeout: Duration)(implicit O: EvaluatorOps[EvaluatorOp]) {
19+
20+
def evaluates(
21+
resolvers: List[String] = Nil,
22+
dependencies: List[Dependency] = Nil,
23+
code: String): Free[EvaluatorOp, EvaluationResponse[EvalResponse]] =
24+
O.evaluates(
25+
url,
26+
authKey,
27+
connTimeout,
28+
readTimeout,
29+
resolvers,
30+
dependencies,
31+
code)
1732
}

client/src/main/scala/org/scalaexercises/evaluator/EvaluatorClient.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,18 @@ package org.scalaexercises.evaluator
77

88
import cats.data.XorT
99
import cats.{MonadError, ~>}
10-
import org.scalaexercises.evaluator.EvaluatorResponses.{EvaluationException, EvaluationResponse, EvaluationResult, EvalIO}
10+
import org.scalaexercises.evaluator.EvaluatorResponses.{EvalIO, EvaluationException, EvaluationResponse, EvaluationResult}
1111
import org.scalaexercises.evaluator.free.algebra.EvaluatorOp
1212

13-
class EvaluatorClient(url: String, authKey: String) {
13+
import scala.concurrent.duration._
14+
import scala.concurrent.duration.Duration
1415

15-
lazy val api = new EvaluatorAPI(url, authKey)
16+
class EvaluatorClient(url: String,
17+
authKey: String,
18+
connTimeout: Duration = 1.second,
19+
readTimeout: Duration = 10.seconds) {
20+
21+
lazy val api = new EvaluatorAPI(url, authKey, connTimeout, readTimeout)
1622

1723
}
1824

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import org.scalaexercises.evaluator.http.HttpClient
1111
import io.circe.generic.auto._
1212
import io.circe.syntax._
1313

14+
import scala.concurrent.duration.Duration
15+
1416
class Evaluator {
1517

1618
import Decoders._
@@ -19,6 +21,8 @@ class Evaluator {
1921

2022
def eval(url: String,
2123
authKey: String,
24+
connTimeout: Duration,
25+
readTimeout: Duration,
2226
resolvers: List[String] = Nil,
2327
dependencies: List[Dependency] = Nil,
2428
code: String): EvaluationResponse[EvalResponse] =

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@ import cats.free.{Free, Inject}
99
import org.scalaexercises.evaluator.{Dependency, EvalResponse}
1010
import org.scalaexercises.evaluator.EvaluatorResponses.EvaluationResponse
1111

12+
import scala.concurrent.duration._
13+
import scala.concurrent.duration.Duration
14+
1215
sealed trait EvaluatorOp[A]
1316
final case class Evaluates(url: String,
1417
authKey: String,
18+
connTimeout: Duration = 1.second,
19+
readTimeout: Duration = 10.seconds,
1520
resolvers: List[String] = Nil,
1621
dependencies: List[Dependency] = Nil,
1722
code: String)
@@ -22,12 +27,21 @@ class EvaluatorOps[F[_]](implicit I: Inject[EvaluatorOp, F]) {
2227
def evaluates(
2328
url: String,
2429
authKey: String,
30+
connTimeout: Duration = 1.second,
31+
readTimeout: Duration = 10.seconds,
2532
resolvers: List[String] = Nil,
2633
dependencies: List[Dependency] = Nil,
2734
code: String
2835
): Free[F, EvaluationResponse[EvalResponse]] =
2936
Free.inject[EvaluatorOp, F](
30-
Evaluates(url, authKey, resolvers, dependencies, code))
37+
Evaluates(
38+
url,
39+
authKey,
40+
connTimeout,
41+
readTimeout,
42+
resolvers,
43+
dependencies,
44+
code))
3145

3246
}
3347

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,24 @@ trait Interpreter {
2727
val evaluator = new Evaluator()
2828

2929
def apply[A](fa: EvaluatorOp[A]): M[A] = fa match {
30-
case Evaluates(url, authKey, resolvers, dependencies, code)
30+
case Evaluates(
31+
url,
32+
authKey,
33+
connTimeout,
34+
readTimeout,
35+
resolvers,
36+
dependencies,
37+
code)
3138
A.pureEval(
3239
Eval.later(
33-
evaluator.eval(url, authKey, resolvers, dependencies, code)))
40+
evaluator.eval(
41+
url,
42+
authKey,
43+
connTimeout,
44+
readTimeout,
45+
resolvers,
46+
dependencies,
47+
code)))
3448
}
3549

3650
}

client/src/main/scala/org/scalaexercises/evaluator/http/HttpClient.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import io.circe.Decoder
99
import org.scalaexercises.evaluator.EvaluatorResponses
1010
import org.scalaexercises.evaluator.EvaluatorResponses.EvaluationResponse
1111

12+
import scala.concurrent.duration._
13+
import scala.concurrent.duration.Duration
14+
1215
object HttpClient {
1316

1417
val authHeaderName = "x-scala-eval-api-token"
@@ -23,11 +26,17 @@ class HttpClient {
2326
url: String,
2427
secretKey: String,
2528
method: String = "post",
29+
connTimeout: Duration = 1.second,
30+
readTimeout: Duration = 10.seconds,
2631
headers: Headers = Map.empty,
2732
data: String
2833
)(implicit D: Decoder[A]): EvaluationResponse[A] =
2934
EvaluatorResponses.toEntity(
30-
HttpRequestBuilder(url = url, httpVerb = method)
35+
HttpRequestBuilder(
36+
url = url,
37+
httpVerb = method,
38+
connTimeout = connTimeout,
39+
readTimeout = readTimeout)
3140
.withHeaders(headers + (authHeaderName -> secretKey))
3241
.withBody(data)
3342
.run)

client/src/main/scala/org/scalaexercises/evaluator/http/HttpRequestBuilder.scala

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@ package org.scalaexercises.evaluator.http
77

88
import org.scalaexercises.evaluator.http.HttpClient._
99

10-
import scalaj.http.Http
10+
import scala.concurrent.duration.Duration
11+
import scalaj.http.{Http, HttpOptions}
1112

1213
case class HttpRequestBuilder(
1314
url: String,
1415
httpVerb: String,
16+
connTimeout: Duration,
17+
readTimeout: Duration,
18+
followRedirects: Boolean = true,
1519
headers: Headers = Map.empty[String, String],
1620
body: Option[String] = None
1721
) {
@@ -25,7 +29,11 @@ case class HttpRequestBuilder(
2529

2630
body
2731
.fold(request)(
28-
request.postData(_).header("content-type", "application/json"))
32+
request
33+
.postData(_)
34+
.option(HttpOptions.connTimeout(connTimeout.toMillis.toInt))
35+
.option(HttpOptions.readTimeout(readTimeout.toMillis.toInt))
36+
.header("content-type", "application/json"))
2937
.asString
3038
}
3139
}

client/src/main/scala/org/scalaexercises/evaluator/implicits.scala

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,7 @@ import cats.std.future._
1010
import cats.{Eval, MonadError}
1111
import org.scalaexercises.evaluator.free.interpreters.Interpreter
1212

13-
object implicits
14-
extends Interpreter
15-
with EvalInstances
16-
with FutureInstances
13+
object implicits extends Interpreter with EvalInstances with FutureInstances
1714

1815
trait EvalInstances {
1916

project/EvaluatorBuild.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ object EvaluatorBuild extends AutoPlugin {
3737

3838

3939
private[this] def baseSettings = Seq(
40-
version := "0.0.1-SNAPSHOT",
40+
version := "0.0.2-SNAPSHOT",
4141
organization := "org.scala-exercises",
4242
scalaVersion := "2.11.8",
4343
scalafmtConfig in ThisBuild := Some(file(".scalafmt")),

0 commit comments

Comments
 (0)