cp-sparrow 0.0.11
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/.gitignore +23 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +66 -0
- data/Rakefile +32 -0
- data/lib/sparrow.rb +25 -0
- data/lib/sparrow/configuration.rb +36 -0
- data/lib/sparrow/core_ext/hash.rb +21 -0
- data/lib/sparrow/middleware.rb +99 -0
- data/lib/sparrow/path_normalizer.rb +10 -0
- data/lib/sparrow/railtie.rb +11 -0
- data/lib/sparrow/request_middleware.rb +11 -0
- data/lib/sparrow/response_middleware.rb +37 -0
- data/lib/sparrow/route_parser.rb +32 -0
- data/lib/sparrow/strategies/form_hash.rb +42 -0
- data/lib/sparrow/strategies/ignore.rb +42 -0
- data/lib/sparrow/strategies/json_format_strategies/array_strategy.rb +17 -0
- data/lib/sparrow/strategies/json_format_strategies/default_json_format_strategy.rb +17 -0
- data/lib/sparrow/strategies/json_format_strategies/json_format_strategy.rb +35 -0
- data/lib/sparrow/strategies/json_format_strategies/rack_body.rb +17 -0
- data/lib/sparrow/strategies/key_transformation/camelize_key.rb +27 -0
- data/lib/sparrow/strategies/key_transformation/key_normalizer.rb +9 -0
- data/lib/sparrow/strategies/key_transformation/underscore_key.rb +13 -0
- data/lib/sparrow/strategies/raw_input.rb +48 -0
- data/lib/sparrow/strategies/transform_params.rb +38 -0
- data/lib/sparrow/transformable.rb +76 -0
- data/lib/sparrow/version.rb +3 -0
- data/sparrow.gemspec +35 -0
- data/spec/integration/apps/rack_app/app.rb +28 -0
- data/spec/integration/apps/rack_app/config.ru +12 -0
- data/spec/integration/apps/rails_app/README.rdoc +261 -0
- data/spec/integration/apps/rails_app/Rakefile +7 -0
- data/spec/integration/apps/rails_app/app/assets/javascripts/application.js +15 -0
- data/spec/integration/apps/rails_app/app/assets/stylesheets/application.css +13 -0
- data/spec/integration/apps/rails_app/app/controllers/application_controller.rb +3 -0
- data/spec/integration/apps/rails_app/app/controllers/welcome_controller.rb +50 -0
- data/spec/integration/apps/rails_app/app/helpers/application_helper.rb +2 -0
- data/spec/integration/apps/rails_app/app/mailers/.gitkeep +0 -0
- data/spec/integration/apps/rails_app/app/models/.gitkeep +0 -0
- data/spec/integration/apps/rails_app/app/views/layouts/application.html.erb +14 -0
- data/spec/integration/apps/rails_app/config.ru +4 -0
- data/spec/integration/apps/rails_app/config/application.rb +72 -0
- data/spec/integration/apps/rails_app/config/boot.rb +10 -0
- data/spec/integration/apps/rails_app/config/environment.rb +5 -0
- data/spec/integration/apps/rails_app/config/environments/development.rb +31 -0
- data/spec/integration/apps/rails_app/config/environments/production.rb +64 -0
- data/spec/integration/apps/rails_app/config/environments/test.rb +32 -0
- data/spec/integration/apps/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/integration/apps/rails_app/config/initializers/inflections.rb +15 -0
- data/spec/integration/apps/rails_app/config/initializers/mime_types.rb +5 -0
- data/spec/integration/apps/rails_app/config/initializers/secret_token.rb +7 -0
- data/spec/integration/apps/rails_app/config/initializers/session_store.rb +8 -0
- data/spec/integration/apps/rails_app/config/initializers/wrap_parameters.rb +10 -0
- data/spec/integration/apps/rails_app/config/locales/en.yml +5 -0
- data/spec/integration/apps/rails_app/config/routes.rb +64 -0
- data/spec/integration/apps/rails_app/lib/assets/.gitkeep +0 -0
- data/spec/integration/apps/rails_app/public/404.html +26 -0
- data/spec/integration/apps/rails_app/public/422.html +26 -0
- data/spec/integration/apps/rails_app/public/500.html +25 -0
- data/spec/integration/apps/rails_app/public/favicon.ico +0 -0
- data/spec/integration/apps/rails_app/script/rails +6 -0
- data/spec/integration/rack/camel_caser_spec.rb +49 -0
- data/spec/integration/rails/camel_caser_accept_header_spec.rb +55 -0
- data/spec/integration/rails/camel_caser_spec.rb +207 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/support/rack_app_helper.rb +19 -0
- data/spec/support/rails_app_helper.rb +21 -0
- data/spec/support/unit_spec_helper.rb +5 -0
- data/spec/unit/camel_caser_spec.rb +23 -0
- data/spec/unit/camelize_key_spec.rb +19 -0
- data/spec/unit/configuration_spec.rb +47 -0
- data/spec/unit/path_normalizer_spec.rb +23 -0
- data/spec/unit/route_parser_spec.rb +45 -0
- metadata +295 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9052fb54e2eab83298497e0037a54c517bd7429a
|
4
|
+
data.tar.gz: 3c871cad86f27adf06bbdcc2cbf35bac4ed479fe
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 92ec954024212d99c3e5d606072f1703131301774de50721360057aaffd256bfa5ef5659e62599153a2672720f5014c33d9023961351b9595e65237cfece1c55
|
7
|
+
data.tar.gz: 7c8ffca7814f4968e898b37d0a827871ce41d311795c92aca695076e6fd408741148f7ba1dafd3f5108dce76d83fee3f877c5c3da9de74c3a41a9cd165d1cd07
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
*.swo
|
7
|
+
*.swp
|
8
|
+
*.log
|
9
|
+
spec/integration/apps/rails_app/log
|
10
|
+
Gemfile.lock
|
11
|
+
InstalledFiles
|
12
|
+
_yardoc
|
13
|
+
coverage
|
14
|
+
doc/
|
15
|
+
lib/bundler/man
|
16
|
+
pkg
|
17
|
+
rdoc
|
18
|
+
spec/reports
|
19
|
+
test/tmp
|
20
|
+
test/version_tmp
|
21
|
+
tmp
|
22
|
+
.idea
|
23
|
+
.project
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
sparrow
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.5
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Daniel Schmidt
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Sparrow
|
2
|
+
|
3
|
+
A Rack middleware for converting the params keys and JSON response keys of a Rack application.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'cp-sparrow', require: 'sparrow'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install sparrow
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
If you're using Rails, that's it. You haven't to do anything more. If you're not using Rails, you will have to add to your config.ru:
|
22
|
+
|
23
|
+
```rb
|
24
|
+
require 'sparrow'
|
25
|
+
|
26
|
+
use Sparrow::Middleware
|
27
|
+
```
|
28
|
+
|
29
|
+
## Configuration
|
30
|
+
|
31
|
+
There are various configuration options as well as HTTP headers available to
|
32
|
+
make the middleware act as you want it to.
|
33
|
+
|
34
|
+
in your configuration file (such as application.rb if you are using Rails)
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
Sparrow.configure do |config|
|
38
|
+
config.excluded_routes = [
|
39
|
+
Regexp.new('api/model/certificates')
|
40
|
+
]
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
There are several options available
|
45
|
+
|
46
|
+
| Option | Example | Meaning |
|
47
|
+
|---------|---------|----------------------|
|
48
|
+
| excluded_routes | see above | An Array of Strings and/or Regexps defining which paths should not be touched by the middleware. The entries should matchs paths for your application. They should *not* start with a leading slash. |
|
49
|
+
| default_json_request_key_transformation_strategy | "underscore" | Defines how the middleware should treat incoming parameters via Request. Which means how they get tranformed, i.e. defining _underscore_ here means that incoming parameters get underscore. Possible values are _underscore_ and _camelize_ |
|
50
|
+
| default_json_response_key_transformation_strategy | "camelize" | Same as *default_json_request_key_transformation_strategy, but for responses. I.e. this defines to which format the keys get transformed when the response gets sent.
|
51
|
+
| json_request_format_header| "request-json-format" | Defines the HTTP Header key which sets the request transformation strategy as in default_json_request_key_transformation_strategy*. This definition has higher priority than the default definition. Any valid HTTP Header String value is possible. Defaults to 'request-json-format' |
|
52
|
+
| json_response_format_header| "response-json-format" | Same as *json_request_format_header*, but for the response handling. Defaults to 'response-json-format' |
|
53
|
+
| camelize_ignore_uppercase_keys | `true` | A boolean that indicates to not camelize keys that are all Uppercase, like CountryCodes "EN" ... |
|
54
|
+
| allowed_content_types |`['application/json', 'text/x-json']` | A list of HTTP content types upon which the middleware shall trigger and possibly start conversion. Defaults to `['application/json', 'application/x-www-form-urlencoded', 'text/x-json']`. If `nil` is present in the list, requests/responses with *no* Content-Type header will be processed as well. Possible values can also be the start of the content-type-header like ```application/``` which matches everything which starts with ```application/``` like ```application/json``` |
|
55
|
+
| allowed_accepts | `['application/json', 'text/x-json']` | Same as **allowed_content_types**, but reacts to the HTTP Accept Header. Applies to the same possible options, behavior. Defaults to the same set of MIME types, but also includes `nil` by default, which ignores checking the Accept header in default configuration |
|
56
|
+
|
57
|
+
## Tests
|
58
|
+
|
59
|
+
Just run `rake` and you are off to go. This runs the whole suite including
|
60
|
+
specs for unit- & integrationtests for Rails and Rack including different versions of Rails.
|
61
|
+
|
62
|
+
If you want to test a specific version of Rails:
|
63
|
+
|
64
|
+
```
|
65
|
+
export RAILS_VERSION=3.2.17; bundle update; bundle exec rspec
|
66
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
RAILS_VERSIONS = [
|
7
|
+
"3.2.17",
|
8
|
+
"4.0.13"
|
9
|
+
]
|
10
|
+
|
11
|
+
def run_tests_for_version(version)
|
12
|
+
commands = []
|
13
|
+
|
14
|
+
commands << "rm Gemfile.lock"
|
15
|
+
commands << "export RAILS_VERSION=#{version}"
|
16
|
+
commands << "bundle update"
|
17
|
+
commands << "bundle exec rspec"
|
18
|
+
|
19
|
+
system(commands.join(';'))
|
20
|
+
end
|
21
|
+
|
22
|
+
task :default do
|
23
|
+
RAILS_VERSIONS.each do |version|
|
24
|
+
puts "Testing gem for rails version: #{version}"
|
25
|
+
success = run_tests_for_version(version)
|
26
|
+
|
27
|
+
if not success
|
28
|
+
puts "Test suite aborted, errors occured."
|
29
|
+
exit($?.exitstatus)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/sparrow.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'active_support/version'
|
2
|
+
require 'sparrow/version'
|
3
|
+
require 'sparrow/configuration'
|
4
|
+
require 'sparrow/route_parser'
|
5
|
+
require 'sparrow/request_middleware'
|
6
|
+
require 'sparrow/response_middleware'
|
7
|
+
require 'sparrow/strategies/json_format_strategies/rack_body'
|
8
|
+
require 'sparrow/strategies/json_format_strategies/array_strategy'
|
9
|
+
require 'sparrow/railtie' if defined?(Rails)
|
10
|
+
|
11
|
+
module Sparrow
|
12
|
+
class << self
|
13
|
+
def configure
|
14
|
+
yield configuration
|
15
|
+
end
|
16
|
+
|
17
|
+
def configuration
|
18
|
+
@configuration ||= Configuration.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def reset_configuration
|
22
|
+
@configuration = nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Sparrow
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :json_request_format_header,
|
4
|
+
:json_response_format_header,
|
5
|
+
:excluded_routes,
|
6
|
+
:default_json_request_key_transformation_strategy,
|
7
|
+
:default_json_response_key_transformation_strategy,
|
8
|
+
:camelize_ignore_uppercase_keys,
|
9
|
+
:allowed_content_types,
|
10
|
+
:allowed_accepts
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@json_request_format_header = 'request-json-format'
|
14
|
+
@json_response_format_header = 'response-json-format'
|
15
|
+
@excluded_routes = []
|
16
|
+
@default_json_request_key_transformation_strategy = :camelize
|
17
|
+
@default_json_response_key_transformation_strategy = :camelize
|
18
|
+
@camelize_ignore_uppercase_keys = true
|
19
|
+
@allowed_content_types = %w[
|
20
|
+
application/json
|
21
|
+
application/x-www-form-urlencoded
|
22
|
+
text/x-json
|
23
|
+
]
|
24
|
+
|
25
|
+
@allowed_accepts = @allowed_content_types + [nil]
|
26
|
+
end
|
27
|
+
|
28
|
+
def json_format_header(type)
|
29
|
+
public_send("json_#{type}_format_header")
|
30
|
+
end
|
31
|
+
|
32
|
+
def default_json_key_transformation_strategy(type)
|
33
|
+
public_send("default_json_#{type}_key_transformation_strategy")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Hash
|
2
|
+
def deep_transform_keys(&block)
|
3
|
+
deep_transform_in_object(self, &block)
|
4
|
+
end
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def deep_transform_in_object(obj, &block)
|
9
|
+
case obj
|
10
|
+
when Hash
|
11
|
+
obj.each_with_object({}) do |(key,value), result|
|
12
|
+
result[yield(key)] = deep_transform_in_object(value, &block)
|
13
|
+
end
|
14
|
+
when Array
|
15
|
+
obj.map { |el| deep_transform_in_object(el, &block) }
|
16
|
+
else
|
17
|
+
obj
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'active_support/core_ext/object/blank'
|
2
|
+
require 'sparrow/strategies/form_hash'
|
3
|
+
require 'sparrow/strategies/raw_input'
|
4
|
+
require 'sparrow/strategies/ignore'
|
5
|
+
|
6
|
+
module Sparrow
|
7
|
+
class Middleware
|
8
|
+
attr_reader :app, :body, :status, :headers
|
9
|
+
|
10
|
+
def initialize(app)
|
11
|
+
@app = app
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
@last_env = env
|
16
|
+
@status, @headers, @body = @app.call(convert(env))
|
17
|
+
end
|
18
|
+
|
19
|
+
def convert(env)
|
20
|
+
env
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def strategy
|
26
|
+
if is_processable?
|
27
|
+
if last_env[Strategies::FormHash::REQUEST_FORM_HASH_KEY]
|
28
|
+
Strategies::FormHash
|
29
|
+
else
|
30
|
+
Strategies::RawInput
|
31
|
+
end
|
32
|
+
else
|
33
|
+
Strategies::Ignore
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def is_processable?
|
38
|
+
accepted_content_type? && accepted_accept_header? && includes_route?
|
39
|
+
end
|
40
|
+
|
41
|
+
def includes_route?
|
42
|
+
path = request.path || last_env['PATH_INFO']
|
43
|
+
RouteParser.new.allow?(path)
|
44
|
+
end
|
45
|
+
|
46
|
+
def accepted_content_type?
|
47
|
+
content_type_equals?(request_content_type) || content_type_matches?(request_content_type)
|
48
|
+
end
|
49
|
+
|
50
|
+
def accepted_accept_header?
|
51
|
+
allowed_accepts = Sparrow.configuration.allowed_accepts
|
52
|
+
accept_header = last_env['ACCEPT'] || last_env['Accept']
|
53
|
+
|
54
|
+
allowed_accepts.include?(nil) || accept_type_matches?(allowed_accepts, accept_header)
|
55
|
+
end
|
56
|
+
|
57
|
+
def last_env
|
58
|
+
@last_env || {}
|
59
|
+
end
|
60
|
+
|
61
|
+
def request
|
62
|
+
request_class = if defined?(Rails) then
|
63
|
+
ActionDispatch::Request
|
64
|
+
else
|
65
|
+
Rack::Request
|
66
|
+
end
|
67
|
+
|
68
|
+
request_class.new(last_env)
|
69
|
+
end
|
70
|
+
|
71
|
+
def request_content_type
|
72
|
+
content_type = request.content_type ||
|
73
|
+
last_env['CONTENT-TYPE'] ||
|
74
|
+
last_env['Content-Type'] ||
|
75
|
+
last_env['CONTENT_TYPE']
|
76
|
+
|
77
|
+
content_type.present? ? content_type : nil
|
78
|
+
end
|
79
|
+
|
80
|
+
def content_type_equals?(type)
|
81
|
+
Sparrow.configuration.allowed_content_types.include?(type)
|
82
|
+
end
|
83
|
+
|
84
|
+
def content_type_matches?(type)
|
85
|
+
matches = Sparrow.configuration.allowed_content_types.map do |acceptable_content_type|
|
86
|
+
(acceptable_content_type && type.to_s.starts_with?(acceptable_content_type.to_s))
|
87
|
+
end
|
88
|
+
|
89
|
+
matches.any?
|
90
|
+
end
|
91
|
+
|
92
|
+
def accept_type_matches?(accepted_headers, type)
|
93
|
+
accepted_headers.detect do |accept|
|
94
|
+
type.include?(accept)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Sparrow
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
initializer 'sparrow.insert_middleware' do |app|
|
4
|
+
# handle request
|
5
|
+
app.config.middleware.insert_after 'Rails::Rack::Logger',
|
6
|
+
'Sparrow::RequestMiddleware'
|
7
|
+
# handle response
|
8
|
+
app.config.middleware.use 'Sparrow::ResponseMiddleware'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'active_support/core_ext/object/inclusion'
|
2
|
+
require 'sparrow/middleware'
|
3
|
+
require 'sparrow/strategies/json_format_strategies/json_format_strategy'
|
4
|
+
|
5
|
+
module Sparrow
|
6
|
+
class ResponseMiddleware < Middleware
|
7
|
+
def call(env)
|
8
|
+
@last_env = env
|
9
|
+
@status, @headers, @body = @app.call(env)
|
10
|
+
[status, headers, converted_response_body]
|
11
|
+
end
|
12
|
+
|
13
|
+
def converted_response_body
|
14
|
+
response_body = Sparrow::Strategies::JsonFormatStrategy.convert(body)
|
15
|
+
|
16
|
+
# just pass the response if something went wrong inside the application
|
17
|
+
return response_body if unprocessable_status?
|
18
|
+
|
19
|
+
if response_body.present?
|
20
|
+
response_strategy = strategy.new(last_env, :response, response_body)
|
21
|
+
response_strategy.handle
|
22
|
+
|
23
|
+
if response_body.is_a?(Array) then
|
24
|
+
response_body
|
25
|
+
else
|
26
|
+
Array(response_strategy.json_body)
|
27
|
+
end
|
28
|
+
else
|
29
|
+
[]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def unprocessable_status?
|
34
|
+
@status.in?(500..511) || @status == 404
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'active_support/core_ext/string/starts_ends_with'
|
2
|
+
require 'sparrow/path_normalizer'
|
3
|
+
|
4
|
+
module Sparrow
|
5
|
+
class RouteParser
|
6
|
+
include PathNormalizer
|
7
|
+
|
8
|
+
attr_accessor :excluded_routes
|
9
|
+
|
10
|
+
def initialize(excluded_routes = Sparrow.configuration.excluded_routes)
|
11
|
+
self.excluded_routes = excluded_routes.map do |route|
|
12
|
+
if route.is_a?(Regexp)
|
13
|
+
route
|
14
|
+
else
|
15
|
+
Regexp.new(route.to_s)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def allow?(path)
|
21
|
+
not exclude?(path)
|
22
|
+
end
|
23
|
+
|
24
|
+
def exclude?(path)
|
25
|
+
normalized_path = normalize_path(path)
|
26
|
+
excluded_routes.each do |route|
|
27
|
+
return true if normalized_path =~ route
|
28
|
+
end
|
29
|
+
return false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|