rack-berater 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3475519672f1074d749de982b36d3a2d0d15a468d38d35b91e0f237de02ba2f8
4
- data.tar.gz: fd08c05ccc694adc8ca540a2468956144c0d180611dd4622070e15aa8dd120ef
3
+ metadata.gz: 7db43d04f14f84dd3e2f3f96352226a48d4e36bfe17467fd1e4eb77015ca6148
4
+ data.tar.gz: 40f79342ca6cd92145a32e2d0b76455850cc4bdd25d701e83157a7acf330bc15
5
5
  SHA512:
6
- metadata.gz: 88428422463a296369f8a2f141c74dadc90f132e2d2072c3505bf33012e344668277e23146125cf43bca55a7d6ec83da0871d6e5b23684a72f3875e48f5d43d7
7
- data.tar.gz: be42f6faa19469ccbfed7995f02b81533051b828e688779d8b5986be6a83174baf71c8ca399b9fabb419766a59fbd8a0c366eefdee977865d7c215970e815527
6
+ metadata.gz: 1f8b3b29d9d62796a49701340fb53446cfca19258f2083c5973bd17e9a9314abb28c7faf7070a260cd4128bb9028346d18f24c98d96d5d8a9e503e5d113f8456
7
+ data.tar.gz: 7ee2bef14d6c4334ef2d65b67a60fe432047a0ce8581f62461cf1fd0c65264083833bbd9f3fe45f2909be3b52cb2147db9704a44e2f9cbc9017b83f69da182d4
@@ -1,9 +1,9 @@
1
- require 'rails/railtie'
1
+ require "rails/railtie"
2
2
 
3
3
  module Rack
4
4
  class Berater
5
5
  class Railtie < Rails::Railtie
6
- initializer "rack.berater.initializer" do |app|
6
+ initializer "rack.berater" do |app|
7
7
  app.middleware.use Rack::Berater
8
8
  end
9
9
  end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Berater
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
data/lib/rack/berater.rb CHANGED
@@ -7,7 +7,7 @@ module Rack
7
7
  class Berater
8
8
  autoload :Railtie, "rack/berater/railtie"
9
9
 
10
- ERROR_TYPES = Set.new([ ::Berater::Overloaded ])
10
+ ERRORS = Set[ ::Berater::Overloaded ]
11
11
 
12
12
  def initialize(app, options = {})
13
13
  @app = app
@@ -39,11 +39,11 @@ module Rack
39
39
 
40
40
  def call(env)
41
41
  if enabled?(env)
42
- @limiter.limit { @app.call(env) }
42
+ limit(env) { @app.call(env) }
43
43
  else
44
44
  @app.call(env)
45
45
  end
46
- rescue *ERROR_TYPES => e
46
+ rescue *ERRORS => e
47
47
  [
48
48
  @options[:status_code],
49
49
  @options[:headers],
@@ -57,5 +57,10 @@ module Rack
57
57
  return false unless @limiter
58
58
  @enabled.nil? ? true : @enabled.call(env)
59
59
  end
60
+
61
+ def limit(env, &block)
62
+ limiter = @limiter.respond_to?(:call) ? @limiter.call(env) : @limiter
63
+ limiter.limit(&block)
64
+ end
60
65
  end
61
66
  end
data/spec/limiter_spec.rb CHANGED
@@ -39,20 +39,42 @@ describe Rack::Berater do
39
39
  end
40
40
 
41
41
  describe "limiter option" do
42
- let(:limiter) { ::Berater::Unlimiter.new }
42
+ context "when limiter is a limiter" do
43
+ let(:limiter) { ::Berater::Unlimiter.new }
43
44
 
44
- include_examples "works nominally"
45
+ include_examples "works nominally"
46
+
47
+ it "calls the limiter" do
48
+ expect(limiter).to receive(:limit).and_call_original
49
+ response
50
+ end
51
+
52
+ context "when operating beyond limits" do
53
+ before { Berater.test_mode = :fail }
45
54
 
46
- it "calls the limiter" do
47
- expect(limiter).to receive(:limit).and_call_original
48
- response
55
+ it "returns an error" do
56
+ expect(response.status).to eq 429
57
+ end
58
+ end
49
59
  end
50
60
 
51
- context "when operating beyond limits" do
52
- before { Berater.test_mode = :fail }
61
+ context "when limiter is a proc" do
62
+ let(:limiter_instance) { ::Berater::Unlimiter.new }
63
+ let(:limiter) { Proc.new { limiter_instance } }
64
+
65
+ include_examples "works nominally"
66
+
67
+ it "calls the proc with env" do
68
+ expect(limiter).to receive(:call).with(Hash).and_call_original
69
+ response
70
+ end
71
+
72
+ context "when operating beyond limits" do
73
+ before { Berater.test_mode = :fail }
53
74
 
54
- it "returns an error" do
55
- expect(response.status).to eq 429
75
+ it "returns an error" do
76
+ expect(response.status).to eq 429
77
+ end
56
78
  end
57
79
  end
58
80
  end
@@ -0,0 +1,17 @@
1
+ require "rails"
2
+ require "rack/berater/railtie"
3
+
4
+ RSpec.describe Rack::Berater::Railtie do
5
+ subject { Rails.initialize! }
6
+
7
+ before do
8
+ Rails.application = Class.new(Rails::Application) do
9
+ config.eager_load = false
10
+ config.logger = ActiveSupport::Logger.new($stdout)
11
+ end
12
+ end
13
+
14
+ it "adds middleware automatically" do
15
+ expect(subject.middleware).to include(Rack::Berater)
16
+ end
17
+ end
data/spec/rescuer_spec.rb CHANGED
@@ -61,7 +61,7 @@ describe Rack::Berater do
61
61
  context "with body nil" do
62
62
  let(:options) { { body: nil } }
63
63
 
64
- it "should default to sending a body" do
64
+ it "falls back to the default" do
65
65
  expect(response.body).to eq "Too Many Requests"
66
66
  end
67
67
  end
@@ -86,6 +86,16 @@ describe Rack::Berater do
86
86
  expect(response.body).to eq body
87
87
  end
88
88
  end
89
+
90
+ context "with an erroneous value" do
91
+ let(:options) { { body: 123 } }
92
+
93
+ it 'should raise an error' do
94
+ expect {
95
+ response
96
+ }.to raise_error(ArgumentError)
97
+ end
98
+ end
89
99
  end
90
100
 
91
101
  context "with custom headers" do
@@ -132,9 +142,9 @@ describe Rack::Berater do
132
142
 
133
143
  context "when an error type is registered with middleware" do
134
144
  around do |example|
135
- Rack::Berater::ERROR_TYPES << IOError
145
+ Rack::Berater::ERRORS << IOError
136
146
  example.run
137
- Rack::Berater::ERROR_TYPES.delete(IOError)
147
+ Rack::Berater::ERRORS.delete(IOError)
138
148
  end
139
149
 
140
150
  it "catches and transforms limit errors" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-berater
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Pepper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-03 00:00:00.000000000 Z
11
+ date: 2021-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: berater
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rspec
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -119,6 +133,7 @@ files:
119
133
  - lib/rack/berater/railtie.rb
120
134
  - lib/rack/berater/version.rb
121
135
  - spec/limiter_spec.rb
136
+ - spec/railtie_spec.rb
122
137
  - spec/rescuer_spec.rb
123
138
  homepage: https://github.com/dpep/rack-berater
124
139
  licenses:
@@ -139,10 +154,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
154
  - !ruby/object:Gem::Version
140
155
  version: '0'
141
156
  requirements: []
142
- rubygems_version: 3.1.4
157
+ rubygems_version: 3.1.6
143
158
  signing_key:
144
159
  specification_version: 4
145
160
  summary: Rack::Berater
146
161
  test_files:
162
+ - spec/railtie_spec.rb
147
163
  - spec/rescuer_spec.rb
148
164
  - spec/limiter_spec.rb