rails-middleware-extensions 1.0.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 +7 -0
- data/Gemfile +2 -0
- data/README.md +77 -0
- data/Rakefile +16 -0
- data/lib/rails-middleware-extensions.rb +11 -0
- data/lib/rails-middleware-extensions/middleware_stack.rb +33 -0
- data/lib/rails-middleware-extensions/middleware_stack_proxy.rb +35 -0
- data/lib/rails-middleware-extensions/version.rb +3 -0
- data/rails-middleware-extensions.gemspec +25 -0
- data/spec/extensions_spec.rb +109 -0
- data/spec/spec_helper.rb +9 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b0d569aadcf19133ea15fb6dcf4cf29edfee4771a48a5b8564a15034d557cf5e
|
4
|
+
data.tar.gz: 7a663b4c4ef8c4ea6d165bce92e13e6c699d6fbd1cd752067cd9d53a75bd2f3f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 428b513ee007c4dbff6b9c2536ef652b3a52581bb4343224c9922124cd76de7acd6aa8228b00e741985f1d0ad9ab011fe7ec3d77e64656742498b061c1300805
|
7
|
+
data.tar.gz: 1116925495e1dadd85c89e193e66ed440b7ccbeaf0990372695a339d65245b9cffbe5b88281961272fe05448aaef8c966c976412494d9bffec6c217d58c04fe8
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
## rails-middleware-extensions [](http://travis-ci.org/camertron/rails-middleware-extensions)
|
2
|
+
|
3
|
+
Adds several additional operations useful for customizing your Rails middleware stack.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
`gem install rails-middleware-extensions`
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
Just add this gem to your gemfile like so:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'rails-middleware-extensions'
|
15
|
+
```
|
16
|
+
|
17
|
+
## Extensions
|
18
|
+
|
19
|
+
Currently two extensions are supported: `move` and `insert_unless_exists`.
|
20
|
+
|
21
|
+
### Insert Unless Exists
|
22
|
+
|
23
|
+
As the name implies, the given middleware will only be inserted if it has not already been added to the middleware stack. For example, here's how we might insert our custom `MyCustomMiddleware` middleware before `Rails::Logger`:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
config.middleware.insert_unless_exists(Rails::Logger, MyCustomMiddleware)
|
27
|
+
```
|
28
|
+
|
29
|
+
`#insert_unless_exists` supports all the arguments regular 'ol `#insert` supports, meaning you can also pass an index to insert before. Here's how to insert our custom middleware at the very beginning of the stack:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
config.middleware.insert_unless_exists(0, MyCustomMiddleware)
|
33
|
+
```
|
34
|
+
|
35
|
+
Finally, use `#insert_after_unless_exists` to insert a particular middleware _after_ another one. For example, to insert `MyCustomMiddleware` after `Rails::Logger`:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
config.middleware.insert_after_unless_exists(Rails::Logger, MyCustomMiddleware)
|
39
|
+
```
|
40
|
+
|
41
|
+
### Move
|
42
|
+
|
43
|
+
As of Rails 5.0, it's not possible to delete a middleware and then re-add it (see [this issue](https://github.com/rails/rails/issues/26303)) because delete operations are always applied last. Instead, consider using `#move`. For example, to move our custom middleware before `Rails::Logger`:
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
config.middleware.move(Rails::Logger, MyCustomMiddleware)
|
47
|
+
```
|
48
|
+
|
49
|
+
Consider `#move`'s cousin, `#move_after`, to move a piece of middleware after another:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
config.middleware.move_after(Rails::Logger, MyCustomMiddleware)
|
53
|
+
```
|
54
|
+
|
55
|
+
As with `#insert_unless_exists`, `#move` and `#move_after` also support numeric indices:
|
56
|
+
|
57
|
+
```ruby
|
58
|
+
config.middleware.move(0, MyCustomMiddleware)
|
59
|
+
```
|
60
|
+
|
61
|
+
## Running Tests
|
62
|
+
|
63
|
+
`bundle exec rspec` should do the trick :) Rails-middleware extensions supports a number of Rails versions, hence all the Gemfiles. There is one Gemfile per supported Rails version. If you'd like to run tests against a particular version, use the `BUNDLE_GEMFILE` environment variable like so:
|
64
|
+
|
65
|
+
```bash
|
66
|
+
BUNDLE_GEMFILE=Gemfile-rails-4.1.x bundle exec rspec
|
67
|
+
```
|
68
|
+
|
69
|
+
By default tests will run against Rails 5.2.x.
|
70
|
+
|
71
|
+
## License
|
72
|
+
|
73
|
+
Licensed under the MIT license. See LICENSE for details.
|
74
|
+
|
75
|
+
## Authors
|
76
|
+
|
77
|
+
* Cameron C. Dutro: http://github.com/camertron
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), 'lib')
|
2
|
+
|
3
|
+
require 'bundler'
|
4
|
+
require 'pry-byebug'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
require 'rubygems/package_task'
|
7
|
+
require 'rails-middleware-extensions'
|
8
|
+
|
9
|
+
Bundler::GemHelper.install_tasks
|
10
|
+
|
11
|
+
task default: :spec
|
12
|
+
|
13
|
+
desc 'Run specs'
|
14
|
+
RSpec::Core::RakeTask.new do |t|
|
15
|
+
t.pattern = './spec/**/*_spec.rb'
|
16
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rails/version'
|
2
|
+
require 'rails-middleware-extensions/middleware_stack'
|
3
|
+
require 'rails-middleware-extensions/middleware_stack_proxy'
|
4
|
+
|
5
|
+
module RailsMiddlewareExtensions
|
6
|
+
def rails5?
|
7
|
+
Rails::VERSION::STRING >= '5.0.0'
|
8
|
+
end
|
9
|
+
|
10
|
+
extend self
|
11
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
class MiddlewareStack
|
3
|
+
def insert_unless_exists(target, source, *args, &block)
|
4
|
+
unless middlewares.include?(source)
|
5
|
+
insert_before(target, source, *args, &block)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
alias_method :insert_before_unless_exists, :insert_unless_exists
|
10
|
+
|
11
|
+
def insert_after_unless_exists(target, source, *args, &block)
|
12
|
+
unless middlewares.include?(source)
|
13
|
+
insert_after(target, source, *args, &block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def move(target, source, *args, &block)
|
18
|
+
index = assert_index(source, :before)
|
19
|
+
middlewares.delete_at(index)
|
20
|
+
|
21
|
+
insert(target, source, *args, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
alias_method :move_before, :move
|
25
|
+
|
26
|
+
def move_after(target, source, *args, &block)
|
27
|
+
index = assert_index(source, :after)
|
28
|
+
middlewares.delete_at(index)
|
29
|
+
|
30
|
+
insert_after(target, source, *args, &block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Rails
|
2
|
+
module Configuration
|
3
|
+
class MiddlewareStackProxy
|
4
|
+
def insert_before_unless_exists(*args, &block)
|
5
|
+
_ops_ << [__method__, args, block]
|
6
|
+
end
|
7
|
+
|
8
|
+
alias_method :insert_unless_exists, :insert_before_unless_exists
|
9
|
+
|
10
|
+
def insert_after_unless_exists(*args, &block)
|
11
|
+
_ops_ << [__method__, args, block]
|
12
|
+
end
|
13
|
+
|
14
|
+
def move_before(*args, &block)
|
15
|
+
_ops_ << [__method__, args, block]
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :move, :move_before
|
19
|
+
|
20
|
+
def move_after(*args, &block)
|
21
|
+
_ops_ << [__method__, args, block]
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def _ops_
|
27
|
+
if RailsMiddlewareExtensions.rails5?
|
28
|
+
@delete_operations
|
29
|
+
else
|
30
|
+
@operations
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), 'lib')
|
2
|
+
require 'rails-middleware-extensions/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'rails-middleware-extensions'
|
6
|
+
s.version = ::RailsMiddlewareExtensions::VERSION
|
7
|
+
s.authors = ['Cameron Dutro']
|
8
|
+
s.email = ['camertron@gmail.com']
|
9
|
+
s.homepage = 'http://github.com/camertron/rails-middleware-extensions'
|
10
|
+
|
11
|
+
s.description = s.summary = 'Adds several additional operations useful for customizing your Rails middleware stack.'
|
12
|
+
|
13
|
+
s.platform = Gem::Platform::RUBY
|
14
|
+
s.has_rdoc = true
|
15
|
+
|
16
|
+
s.add_dependency 'railties', '>= 4.0'
|
17
|
+
s.add_dependency 'actionpack', '>= 4.0'
|
18
|
+
|
19
|
+
s.add_development_dependency 'pry-byebug'
|
20
|
+
s.add_development_dependency 'rake'
|
21
|
+
s.add_development_dependency 'rspec'
|
22
|
+
|
23
|
+
s.require_path = 'lib'
|
24
|
+
s.files = Dir['{lib,spec}/**/*', 'Gemfile', 'README.md', 'Rakefile', 'rails-middleware-extensions.gemspec']
|
25
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'middleware extensions' do
|
4
|
+
class TestMiddleware
|
5
|
+
# at least make it _look_ like real middleware ;)
|
6
|
+
def initialize(*); end
|
7
|
+
def call(*); end
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:app) do
|
11
|
+
Class.new(Rails::Application) do
|
12
|
+
config.eager_load = false
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
before do
|
17
|
+
unless RailsMiddlewareExtensions.rails5?
|
18
|
+
# Rails 4 unfortunately stores a number of things in class variables that survive
|
19
|
+
# creating new application instances. We have to clean things up here by forcibly
|
20
|
+
# resetting them all back to nil or we'll see some test pollution, i.e. middleware
|
21
|
+
# stacks from previous examples will persist into the contexts of other examples.
|
22
|
+
|
23
|
+
(Rails::Railtie::Configuration.class_variables - [:@@options]).each do |cv|
|
24
|
+
Rails::Railtie::Configuration.class_variable_set(cv, nil)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Furthermore, Rails 4.0 raises an error if you try to subclass Rails::Application.
|
28
|
+
# It checks to see if Rails.application non-nil, so we set it to nil here as a
|
29
|
+
# workaround.
|
30
|
+
Rails.application = nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#insert*_unless_exists' do
|
35
|
+
it 'inserts the middleware' do
|
36
|
+
app.initializer('example') do |app|
|
37
|
+
app.middleware.insert_unless_exists(1, TestMiddleware)
|
38
|
+
end
|
39
|
+
|
40
|
+
app.initialize!
|
41
|
+
|
42
|
+
expect(app.middleware.middlewares.index(TestMiddleware)).to eq(1)
|
43
|
+
expect(app.middleware.middlewares.count { |m| m == TestMiddleware }).to eq(1)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'inserts the middleware after' do
|
47
|
+
app.initializer('example') do |app|
|
48
|
+
app.middleware.insert_after_unless_exists(1, TestMiddleware)
|
49
|
+
end
|
50
|
+
|
51
|
+
app.initialize!
|
52
|
+
|
53
|
+
expect(app.middleware.middlewares.index(TestMiddleware)).to eq(2)
|
54
|
+
expect(app.middleware.middlewares.count { |m| m == TestMiddleware }).to eq(1)
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when the middleware already exists' do
|
58
|
+
before do
|
59
|
+
app.initializer('before') do |app|
|
60
|
+
app.middleware.use(TestMiddleware)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'only includes the middleware once' do
|
65
|
+
app.initializer('example') do |app|
|
66
|
+
app.middleware.insert_unless_exists(1, TestMiddleware)
|
67
|
+
end
|
68
|
+
|
69
|
+
app.initialize!
|
70
|
+
|
71
|
+
expect(app.middleware.middlewares.count { |m| m == TestMiddleware }).to eq(1)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '#move' do
|
77
|
+
it 'asserts that the middleware is not in the first position when inserted' do
|
78
|
+
app.initializer('example') do |app|
|
79
|
+
app.middleware.insert(5, TestMiddleware)
|
80
|
+
end
|
81
|
+
|
82
|
+
app.initialize!
|
83
|
+
|
84
|
+
expect(app.middleware.middlewares.index(TestMiddleware)).to_not eq(0)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'moves the middleware to the desired position' do
|
88
|
+
app.initializer('example') do |app|
|
89
|
+
app.middleware.insert(5, TestMiddleware)
|
90
|
+
app.middleware.move(0, TestMiddleware)
|
91
|
+
end
|
92
|
+
|
93
|
+
app.initialize!
|
94
|
+
|
95
|
+
expect(app.middleware.middlewares.index(TestMiddleware)).to eq(0)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'moves the middleware into the desired position after' do
|
99
|
+
app.initializer('example') do |app|
|
100
|
+
app.middleware.insert(5, TestMiddleware)
|
101
|
+
app.middleware.move_after(0, TestMiddleware)
|
102
|
+
end
|
103
|
+
|
104
|
+
app.initialize!
|
105
|
+
|
106
|
+
expect(app.middleware.middlewares.index(TestMiddleware)).to eq(1)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails-middleware-extensions
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Cameron Dutro
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-04-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: railties
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: actionpack
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry-byebug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Adds several additional operations useful for customizing your Rails
|
84
|
+
middleware stack.
|
85
|
+
email:
|
86
|
+
- camertron@gmail.com
|
87
|
+
executables: []
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- Gemfile
|
92
|
+
- README.md
|
93
|
+
- Rakefile
|
94
|
+
- lib/rails-middleware-extensions.rb
|
95
|
+
- lib/rails-middleware-extensions/middleware_stack.rb
|
96
|
+
- lib/rails-middleware-extensions/middleware_stack_proxy.rb
|
97
|
+
- lib/rails-middleware-extensions/version.rb
|
98
|
+
- rails-middleware-extensions.gemspec
|
99
|
+
- spec/extensions_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
homepage: http://github.com/camertron/rails-middleware-extensions
|
102
|
+
licenses: []
|
103
|
+
metadata: {}
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 2.7.6
|
121
|
+
signing_key:
|
122
|
+
specification_version: 4
|
123
|
+
summary: Adds several additional operations useful for customizing your Rails middleware
|
124
|
+
stack.
|
125
|
+
test_files: []
|