Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,6 @@ jobs:
build:
name: Build and test
runs-on: ubuntu-latest
services:
memcached:
image: memcached:alpine
ports:
- 11211:11211
strategy:
matrix:
include:
Expand Down
6 changes: 3 additions & 3 deletions lib/ex_limiter.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ defmodule ExLimiter do
usage once configured is:

case ExLimiter.consume(bucket, 1, scale: 1000, limit: 5) do
{:ok, bucket} -> #do some work
{:error, :rate_limited} -> #fail
{:ok, bucket} -> # do some work
{:error, :rate_limited} -> # fail
end

Additionally, if you want to have multiple rate limiters with diverse backend implementations,
Expand All @@ -22,5 +22,5 @@ defmodule ExLimiter do
use ExLimiter.Base, storage: MyStorage
end
"""
use ExLimiter.Base, storage: Application.compile_env(:ex_limiter, :storage, ExLimiter.Storage.Memcache)
use ExLimiter.Base, storage: Application.compile_env(:ex_limiter, :storage, ExLimiter.Storage.PG2Shard)
end
102 changes: 0 additions & 102 deletions lib/ex_limiter/storage/memcache.ex

This file was deleted.

10 changes: 1 addition & 9 deletions mix.exs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
defmodule ExLimiter.Mixfile do
use Mix.Project

@version "1.5.1"
@version "2.0.0"

def project do
[
Expand All @@ -28,7 +28,6 @@ defmodule ExLimiter.Mixfile do

defp deps do
[
{:memcachir, "~> 3.3.1", [optional: true] ++ run_in_test()},
{:plug, "~> 1.4"},
{:libring, "~> 1.0"},
{:telemetry, "~> 1.0"},
Expand All @@ -46,13 +45,6 @@ defmodule ExLimiter.Mixfile do
]
end

defp run_in_test do
case Mix.env() do
:test -> []
_ -> [runtime: false]
end
end

defp description do
"Token bucket rate limiter written in elixir with configurable backends"
end
Expand Down
7 changes: 0 additions & 7 deletions mix.lock
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
%{
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
"earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"},
"elasticachex": {:hex, :elasticachex, "1.1.3", "c5cc1255b3f25c53df16206959816824cc65e65be5be8462af069be59af63013", [:mix], [{:socket, "~> 0.3", [hex: :socket, repo: "hexpm", optional: false]}], "hexpm", "425814b1406729f2f037ff3b90755162b1d8b7fef23b3c23deac295e05cec2fc"},
"ex_doc": {:hex, :ex_doc, "0.39.3", "519c6bc7e84a2918b737aec7ef48b96aa4698342927d080437f61395d361dcee", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "0590955cf7ad3b625780ee1c1ea627c28a78948c6c0a9b0322bd976a079996e1"},
"herd": {:hex, :herd, "0.4.3", "97469cf289c1e89a4f2b356da486ae5a354751f91c10cd3749af6aedebd9a775", [:mix], [{:libring, "~> 1.1", [hex: :libring, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}], "hexpm", "44bfd2c42a206431495d5103a77f52a992f4f1391a13459a9e8fd7b143cd99c9"},
"libring": {:hex, :libring, "1.7.0", "4f245d2f1476cd7ed8f03740f6431acba815401e40299208c7f5c640e1883bda", [:mix], [], "hexpm", "070e3593cb572e04f2c8470dd0c119bc1817a7a0a7f88229f43cf0345268ec42"},
"makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
"makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
"makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"},
"memcachex": {:hex, :memcachex, "0.5.7", "00dc47d926eba11dfc1f2db606c37caff34d9fafd57f0adc10b49418931e77af", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:poison, "~> 2.1 or ~> 3.0 or ~> 4.0 or ~> 5.0 or ~> 6.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a75e5b712c17bc25326c03c4c1b45fae39816b6fdacce3242724c7131f210ec1"},
"memcachir": {:hex, :memcachir, "3.3.1", "2099fd7d518b58172b417f932f9590e3fd3e11deb811c2a3a252605751af6aa7", [:mix], [{:elasticachex, "~> 1.1", [hex: :elasticachex, repo: "hexpm", optional: false]}, {:herd, "~> 0.4.3", [hex: :herd, repo: "hexpm", optional: false]}, {:memcachex, "~> 0.5", [hex: :memcachex, repo: "hexpm", optional: false]}], "hexpm", "526536e9585820894381a643aa3042f7f84e25e986e3c90f413fe0896f8bb513"},
"mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
"plug": {:hex, :plug, "1.19.1", "09bac17ae7a001a68ae393658aa23c7e38782be5c5c00c80be82901262c394c0", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "560a0017a8f6d5d30146916862aaf9300b7280063651dd7e532b8be168511e62"},
"plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"},
"poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"},
"socket": {:hex, :socket, "0.3.13", "98a2ab20ce17f95fb512c5cadddba32b57273e0d2dba2d2e5f976c5969d0c632", [:mix], [], "hexpm", "f82ea9833ef49dde272e6568ab8aac657a636acb4cf44a7de8a935acb8957c2e"},
"styler": {:hex, :styler, "1.10.1", "9229050c978bfaaab1d94e8673843576d0127d48fe64824a30babde3d6342475", [:mix], [], "hexpm", "d86cbcc70e8ab424393af313d1d885931ba9dc7c383d7dd30f4ab255a8d39f73"},
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
}
14 changes: 7 additions & 7 deletions test/ex_limiter/plug_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ defmodule ExLimiter.PlugTest do
%{ex_limiter: %{bucket_name: bucket_name, bucket_version: bucket_version}} = conn.assigns

assert String.ends_with?(bucket_name, "127.0.0.1")
assert bucket_version == %{last: 0, value: 0}
assert %{last: _, value: _} = bucket_version
end

test "it will decorate a connection on error", %{limiter: config, conn: conn} do
Expand All @@ -61,14 +61,14 @@ defmodule ExLimiter.PlugTest do

assert String.ends_with?(bucket_name, "127.0.0.1")
end
end

defp decorate(conn, {:ok, %{key: bucket_name, version: bucket_version}}) do
assign(conn, :ex_limiter, %{bucket_name: bucket_name, bucket_version: bucket_version})
end
defp decorate(conn, {:ok, %{key: bucket_name, value: value, last: last}}) do
assign(conn, :ex_limiter, %{bucket_name: bucket_name, bucket_version: %{last: last, value: value}})
end

defp decorate(conn, {:rate_limited, bucket_name}) do
assign(conn, :ex_limiter, %{bucket_name: bucket_name})
defp decorate(conn, {:rate_limited, bucket_name}) do
assign(conn, :ex_limiter, %{bucket_name: bucket_name})
end
end

defp setup_conn(_) do
Expand Down
18 changes: 8 additions & 10 deletions test/ex_limiter/storage/pg2_shard_test.exs
Original file line number Diff line number Diff line change
@@ -1,46 +1,44 @@
defmodule ExLimiter.Storage.PG2ShardTest do
use ExLimiter.DataCase, async: false

alias ExLimiter.PG2Limiter

setup do
{:ok, bucket_name: bucket_name()}
end

describe "#consume" do
test "it will rate limit", %{bucket_name: bucket_name} do
{:ok, bucket} = PG2Limiter.consume(bucket_name, 1)
{:ok, bucket} = ExLimiter.consume(bucket_name, 1)

assert bucket.key == bucket_name
assert bucket.value >= 100

{:ok, bucket} = PG2Limiter.consume(bucket_name, 5)
{:ok, bucket} = ExLimiter.consume(bucket_name, 5)

assert bucket.value >= 500

{:error, :rate_limited} = PG2Limiter.consume(bucket_name, 6)
{:error, :rate_limited} = ExLimiter.consume(bucket_name, 6)
end
end

describe "#delete" do
test "It will wipe a bucket", %{bucket_name: bucket_name} do
{:ok, bucket} = PG2Limiter.consume(bucket_name, 5)
{:ok, bucket} = ExLimiter.consume(bucket_name, 5)

assert bucket.value >= 500

PG2Limiter.delete(bucket_name)
ExLimiter.delete(bucket_name)

{:ok, bucket} = PG2Limiter.consume(bucket_name, 1)
{:ok, bucket} = ExLimiter.consume(bucket_name, 1)

assert bucket.value <= 500
end
end

describe "#remaining" do
test "It will properly deconvert the remaining capacity in a bucket", %{bucket_name: bucket_name} do
{:ok, bucket} = PG2Limiter.consume(bucket_name, 5)
{:ok, bucket} = ExLimiter.consume(bucket_name, 5)

assert PG2Limiter.remaining(bucket) == 5
assert ExLimiter.remaining(bucket) == 5
end
end
end
4 changes: 0 additions & 4 deletions test/support/pg2_limiter.ex

This file was deleted.