Skip to content

Instantly share code, notes, and snippets.

View JohnMurray's full-sized avatar

John Murray JohnMurray

View GitHub Profile
@JohnMurray
JohnMurray / ratelimit.scala
Last active June 21, 2018 20:34
Initial rate-limiting code
import java.time.LocalDateTime
import java.util.{Deque, LinkedList}
import scala.concurrent.{Future, Promise}
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}
class ApiService[T](limit: Long, timeFrame: FiniteDuration) {
case class RequestQueueItem(f: () => Future[T], p: Promise[T])
@JohnMurray
JohnMurray / mock_client_api.scala
Last active February 17, 2018 04:26
Some simple test code we can use to play around with stuff in a REPL or simple project
import scala.concurrent._
import ExecutionContext.Implicits.global
object MockAPI {
private val rand = new scala.util.Random()
class RateLimitException(msg: String) extends Throwable(msg, null)
def simpleService: Future[String] = Future { "1, 2, 3, 4, 5, 6" }
@JohnMurray
JohnMurray / ratelimit.scala
Last active June 21, 2018 21:45
Adding user-defined rate-limit-error checking
class ApiService[T](limit: Long, timeFrame: FiniteDuration) {
// other code ...
type LimitDetector = PartialFunction[Either[Throwable, T], Boolean]
case class RequestQueueItem(f: () => Future[T],
p: Promise[T],
limitDetector: LimitDetector)
private var limitDetection: LimitDetector = {
case Left(_) => true
@JohnMurray
JohnMurray / detect_ratelimit_error.scala
Created February 1, 2018 14:20
Simple function signature to detect a specific error
Either[Throwable, T] => Boolean
class ApiService[T](limit: Long, timeFrame: FiniteDuration) {
// previous code ...
private def hasCapacity(): Boolean = {
val now = LocalDateTime.now()
if (now.isAfter(windowStopTime)) {
windowStopTime = now.plusSeconds(timeFrame.toSeconds)
requestCount = 0
true
} else {
import scala.concurrent.ExecutionContext.Implicits.global
class ApiService[T](limit: Long, timeFrame: FiniteDuration) {
// previous code ...
private def makeRequest(): Unit = requestQueue.pollFirst() match {
case null => // do nothing
case req =>
requestCount += 1
import java.time.LocalDateTime
import java.util.{Deque, LinkedList}
import scala.concurrent.{Future, Promise}
import scala.concurrent.duration._
class ApiService[T](limit: Long, timeFrame: FiniteDuration) {
case class RequestQueueItem(f: () => Future[T], p: Promise[T])
private var requestQueue: Deque[RequestQueueItem] = new LinkedList[RequestQueueItem]()
@JohnMurray
JohnMurray / .travis.yaml
Last active January 30, 2018 02:20
Simple Travis CI build for a Go project
language: go
go:
- 1.8
- 1.9.x
- master
matrix:
allow_failures:
go: master
@JohnMurray
JohnMurray / .travis.yaml
Last active January 30, 2018 02:18
Snippet to run gometalinter in travis
script:
- go test -v ./...
- gometalinter.v2 --vendor --disable-all --enable=errcheck --enable=vet --enable=deadcode ./...
@JohnMurray
JohnMurray / .travis.yaml
Last active January 30, 2018 02:19
Snippet to run gometalinter in travis
script:
- go test -v ./...
- gometalinter.v2 --vendor ./...