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.
@@ -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
@@ -0,0 +1,2 @@
1
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile-rails-4.0.x', __FILE__)
2
+ Bundler.load
@@ -0,0 +1,77 @@
1
+ ## rails-middleware-extensions [![Build Status](https://secure.travis-ci.org/camertron/rails-middleware-extensions.png?branch=master)](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
@@ -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,3 @@
1
+ module RailsMiddlewareExtensions
2
+ VERSION = '1.0.0'
3
+ 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
@@ -0,0 +1,9 @@
1
+ $:.push(__dir__)
2
+
3
+ require 'rails'
4
+ require 'rspec'
5
+ require 'pry-byebug'
6
+ require 'rails-middleware-extensions'
7
+
8
+ RSpec.configure do |config|
9
+ end
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: []