Skip to content

Commit a1f700d

Browse files
committed
move non-implicit methods to companion object for easier testing
1 parent f150eb0 commit a1f700d

File tree

2 files changed

+42
-40
lines changed

2 files changed

+42
-40
lines changed

openai-client/src/main/scala/io/cequence/openaiscala/RetryHelpers.scala

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,49 @@ package io.cequence.openaiscala
33
import akka.actor.{ActorSystem, Scheduler}
44
import akka.pattern.after
55
import akka.stream.Materializer
6-
import io.cequence.openaiscala.RetryHelpers.RetrySettings
6+
import io.cequence.openaiscala.RetryHelpers.{RetrySettings, retry}
77

88
import scala.concurrent.duration.{DurationInt, FiniteDuration}
99
import scala.concurrent.{ExecutionContext, Future}
1010
import scala.util.control.NonFatal
1111

1212
object RetryHelpers {
13+
private[openaiscala] def delay(
14+
n: Integer
15+
)(implicit retrySettings: RetrySettings): FiniteDuration =
16+
FiniteDuration(
17+
scala.math.round(
18+
retrySettings.delayOffset.length + scala.math.pow(
19+
retrySettings.delayBase,
20+
n.doubleValue()
21+
)
22+
),
23+
retrySettings.delayOffset.unit
24+
)
25+
26+
private[openaiscala] def retry[T](
27+
attempt: () => Future[T],
28+
attempts: Int
29+
)(implicit
30+
ec: ExecutionContext,
31+
scheduler: Scheduler,
32+
retrySettings: RetrySettings
33+
): Future[T] = {
34+
try {
35+
if (attempts > 0) {
36+
attempt().recoverWith { case Retryable(_) =>
37+
after(delay(attempts), scheduler) {
38+
retry(attempt, attempts - 1)
39+
}
40+
}
41+
} else {
42+
attempt()
43+
}
44+
} catch {
45+
case NonFatal(error) => Future.failed(error)
46+
}
47+
}
48+
1349
final case class RetrySettings(
1450
maxRetries: Int = 5,
1551
delayOffset: FiniteDuration = 2.seconds,
@@ -18,13 +54,15 @@ object RetryHelpers {
1854
def constantInterval(interval: FiniteDuration): RetrySettings =
1955
copy(delayBase = 0).copy(delayOffset = interval)
2056
}
57+
2158
object RetrySettings {
2259
def apply(interval: FiniteDuration): RetrySettings =
2360
RetrySettings().constantInterval(
2461
interval
2562
)
2663

2764
}
65+
2866
}
2967

3068
trait RetryHelpers {
@@ -41,42 +79,6 @@ trait RetryHelpers {
4179
): Future[T] = {
4280
retry(() => f, retrySettings.maxRetries)
4381
}
44-
45-
private[openaiscala] def delay(
46-
n: Integer
47-
)(implicit retrySettings: RetrySettings): FiniteDuration =
48-
FiniteDuration(
49-
scala.math.round(
50-
retrySettings.delayOffset.length + scala.math.pow(
51-
retrySettings.delayBase,
52-
n.doubleValue()
53-
)
54-
),
55-
retrySettings.delayOffset.unit
56-
)
57-
58-
private[openaiscala] def retry(
59-
attempt: () => Future[T],
60-
attempts: Int
61-
)(implicit
62-
ec: ExecutionContext,
63-
scheduler: Scheduler,
64-
retrySettings: RetrySettings
65-
): Future[T] = {
66-
try {
67-
if (attempts > 0) {
68-
attempt().recoverWith { case Retryable(_) =>
69-
after(delay(attempts), scheduler) {
70-
retry(attempt, attempts - 1)
71-
}
72-
}
73-
} else {
74-
attempt()
75-
}
76-
} catch {
77-
case NonFatal(error) => Future.failed(error)
78-
}
79-
}
80-
8182
}
83+
8284
}

openai-client/src/test/scala/io/cequence/openaiscala/RetryHelpersSpec.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package io.cequence.openaiscala
22

33
import akka.actor.{ActorSystem, Scheduler}
44
import akka.testkit.TestKit
5-
import io.cequence.openaiscala.RetryHelpers.RetrySettings
5+
import io.cequence.openaiscala.RetryHelpers.{RetrySettings, retry}
66
import org.mockito.scalatest.MockitoSugar
77
import org.scalatest.RecoverMethods._
88
import org.scalatest.concurrent.ScalaFutures
@@ -111,7 +111,7 @@ class RetryHelpersSpec
111111
val mockRetryable = mock[Retryable]
112112
when(mockRetryable.attempt())
113113
.thenReturn(results.head, results.takeRight(results.length - 1): _*)
114-
val result = future.retry(() => mockRetryable.attempt(), attempts)
114+
val result = retry(() => mockRetryable.attempt(), attempts)
115115
test(mockRetryable, result)
116116
}
117117

0 commit comments

Comments
 (0)