sinatra-strong-params 0.0.3 → 0.1.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 +5 -5
- data/.travis.yml +5 -0
- data/CHANGELOG.md +33 -0
- data/README.md +11 -18
- data/lib/sinatra/strong-params.rb +18 -24
- data/lib/sinatra/strong-params/version.rb +1 -1
- data/sinatra-strong-params.gemspec +3 -4
- data/spec/strong-params_spec.rb +87 -31
- data/spec/test_helper.rb +7 -0
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c3eb2d1f7ec3984115e65b658c4afa7d908dcd7fdae1db169aeb8cc069b0930c
|
4
|
+
data.tar.gz: 769138e7be535e8b77015bf981277d02dbad16df0bf113f105e506d097e5f2bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4d7402165a277e6ee1cf7b95ee28c6f3d14c00b41637e3efb07e5facd90cb2289020e8349999d29e1cddb5abcd43b2d6547124b2c5db09cb79db50574e2e137
|
7
|
+
data.tar.gz: '09d99345d2d18af039df5a5f1935fcb78a682337b11b49bd5f5d76b2e536d3df346b8b300e51e6ff9ca0f4dde5f15c2f8b8580619e09748ac99b79995a826f9d'
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
|
+
|
7
|
+
## [Unreleased]
|
8
|
+
|
9
|
+
## [0.1.0] - 2019-01-27
|
10
|
+
|
11
|
+
### Added
|
12
|
+
- Now you don't need to explicitly allow the needed params anymore when using `needs` and `allows` combined.
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
- The error message for missing needed params now includes a list of the missing ones.
|
16
|
+
|
17
|
+
### Fixed
|
18
|
+
- When using `allows`, the params hash keys was changing from string to symbol.
|
19
|
+
|
20
|
+
## [0.0.3] - 2017-01-30
|
21
|
+
|
22
|
+
### Added
|
23
|
+
- Gem test setup and basic tests.
|
24
|
+
|
25
|
+
## [0.0.2] - 2015-11-12
|
26
|
+
|
27
|
+
### Added
|
28
|
+
- Accept `missing_parameter_message` configuration for missing needed params error message.
|
29
|
+
|
30
|
+
## [0.0.1] - 2014-07-12
|
31
|
+
|
32
|
+
### Added
|
33
|
+
- Gem created.
|
data/README.md
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
# Sinatra::StrongParams
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
[](https://badge.fury.io/rb/sinatra-strong-params)
|
4
|
+
[](https://travis-ci.org/evanleck/sinatra-strong-params)
|
5
5
|
|
6
|
+
A really naive parameter filtering implementation for Sinatra.
|
6
7
|
|
7
8
|
## Installation
|
8
9
|
|
9
10
|
Add this line to your application's Gemfile:
|
10
11
|
|
11
|
-
gem 'sinatra-strong-params', :
|
12
|
+
gem 'sinatra-strong-params', require: 'sinatra/strong-params'
|
12
13
|
|
13
14
|
And then execute:
|
14
15
|
|
@@ -18,7 +19,7 @@ Or install it yourself as:
|
|
18
19
|
|
19
20
|
$ gem install sinatra-strong-params
|
20
21
|
|
21
|
-
If you are using a Modular Sinatra application such as `class
|
22
|
+
If you are using a Modular Sinatra application such as `class MyApp < Sinatra::Base` you must include any desired extensions explicitly within your Sinatra application:
|
22
23
|
|
23
24
|
```ruby
|
24
25
|
register Sinatra::StrongParams
|
@@ -28,8 +29,6 @@ register Sinatra::StrongParams
|
|
28
29
|
|
29
30
|
This gem adds two filters to Sinatra routes: `allows` and `needs`.
|
30
31
|
|
31
|
-
|
32
|
-
|
33
32
|
### Allows
|
34
33
|
|
35
34
|
A way to whitelist parameters in the request scope.
|
@@ -40,10 +39,7 @@ get '/', allows: [:id, :action] do
|
|
40
39
|
end
|
41
40
|
```
|
42
41
|
|
43
|
-
`allows` modifies the parameters available in the request scope
|
44
|
-
beware, though it stashes unmodified params in @_params.
|
45
|
-
|
46
|
-
|
42
|
+
`allows` modifies the parameters available in the request scope keeping just the allowed params.
|
47
43
|
|
48
44
|
### Needs
|
49
45
|
|
@@ -56,9 +52,9 @@ end
|
|
56
52
|
```
|
57
53
|
|
58
54
|
`needs` does not modify the parameters available to the request scope
|
59
|
-
|
55
|
+
but raises a `RequiredParamMissing` error if a needed param is missing.
|
60
56
|
|
61
|
-
Catching a missing parameter:
|
57
|
+
Catching a missing parameter error:
|
62
58
|
|
63
59
|
```ruby
|
64
60
|
error RequiredParamMissing do
|
@@ -66,23 +62,20 @@ error RequiredParamMissing do
|
|
66
62
|
end
|
67
63
|
```
|
68
64
|
|
69
|
-
|
70
|
-
|
71
|
-
### Both
|
65
|
+
### Allows and Needs
|
72
66
|
|
73
67
|
Wanna get super restrictive? Can do.
|
74
68
|
|
75
69
|
```ruby
|
76
|
-
post '/login',
|
70
|
+
post '/login', needs: [:email, :password], allows: [:name] do
|
77
71
|
# handle yo business
|
78
72
|
end
|
79
73
|
```
|
80
74
|
|
81
|
-
|
82
75
|
## Contributing
|
83
76
|
|
84
77
|
1. Fork it ( https://github.com/[my-github-username]/sinatra-strong-params/fork )
|
85
78
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
86
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
79
|
+
3. Commit your changes with tests (`git commit -am 'Add some feature'`)
|
87
80
|
4. Push to the branch (`git push origin my-new-feature`)
|
88
81
|
5. Create a new Pull Request
|
@@ -23,16 +23,12 @@ module Sinatra
|
|
23
23
|
unless @params.empty?
|
24
24
|
@_params = @_params || @params # for safety
|
25
25
|
globals = settings.globally_allowed_parameters
|
26
|
-
|
26
|
+
needed = @_needed || []
|
27
|
+
passable = (globals | passable | needed).map(&:to_sym) # make sure it's a symbol
|
27
28
|
|
28
|
-
#
|
29
|
-
@params = @params.
|
30
|
-
passable.include?(param.to_sym)
|
31
|
-
end
|
32
|
-
|
33
|
-
# Copy Sinatra's default proc to allow indifferent access.
|
34
|
-
@params.tap do |params|
|
35
|
-
params.default_proc = @_params.default_proc.dup rescue nil
|
29
|
+
# Keep only the allowed parameters.
|
30
|
+
@params = @params.delete_if do |param, _value|
|
31
|
+
!passable.include?(param.to_sym)
|
36
32
|
end
|
37
33
|
end
|
38
34
|
end
|
@@ -50,31 +46,29 @@ module Sinatra
|
|
50
46
|
#
|
51
47
|
app.set(:needs) do |*needed|
|
52
48
|
condition do
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
needed = needed.map(&:to_sym) # make sure it's a symbol
|
57
|
-
sym_params = @params.dup
|
49
|
+
needed = needed.map(&:to_sym) # make sure it's a symbol
|
50
|
+
@_needed = needed
|
51
|
+
sym_params = @params.dup
|
58
52
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
53
|
+
# symbolize the keys so we know what we're looking at
|
54
|
+
sym_params.keys.each do |key|
|
55
|
+
sym_params[(key.to_sym rescue key) || key] = sym_params.delete(key)
|
56
|
+
end
|
63
57
|
|
64
|
-
|
65
|
-
|
66
|
-
|
58
|
+
missing_params = needed.select { |key| sym_params[key].nil? || sym_params[key].empty? }
|
59
|
+
if missing_params.any?
|
60
|
+
fail RequiredParamMissing, "#{settings.missing_parameter_message} #{missing_params.join(', ')}"
|
67
61
|
end
|
68
62
|
end
|
69
63
|
end
|
70
64
|
|
71
65
|
# These will always pass through the 'allows' method
|
72
|
-
#
|
73
|
-
#
|
66
|
+
# and will be mapped to symbols. I often use [:redirect_to, :_csrf] here
|
67
|
+
# because I always want them to pass through for later processing
|
74
68
|
app.set :globally_allowed_parameters, []
|
75
69
|
|
76
70
|
# The default message when RequiredParamMissing is raised.
|
77
|
-
app.set :missing_parameter_message, 'One or more required parameters were missing
|
71
|
+
app.set :missing_parameter_message, 'One or more required parameters were missing:'
|
78
72
|
|
79
73
|
# Change the default behavior for missing parameters by overriding this route.
|
80
74
|
# For example...
|
@@ -7,10 +7,9 @@ require 'sinatra/strong-params/version'
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
spec.name = 'sinatra-strong-params'
|
9
9
|
spec.version = Sinatra::StrongParams::VERSION
|
10
|
-
spec.authors = ['Evan Lecklider']
|
11
|
-
spec.email = ['evan@lecklider.com']
|
12
|
-
spec.summary = '
|
13
|
-
spec.description = spec.summary
|
10
|
+
spec.authors = ['Evan Lecklider', 'Gustavo Sobral']
|
11
|
+
spec.email = ['evan@lecklider.com', 'ghsobral@gmail.com']
|
12
|
+
spec.summary = 'Basic strong parameter filters for Sinatra.'
|
14
13
|
spec.homepage = 'https://github.com/evanleck/sinatra-strong-params'
|
15
14
|
spec.license = 'MIT'
|
16
15
|
|
data/spec/strong-params_spec.rb
CHANGED
@@ -3,19 +3,19 @@
|
|
3
3
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
4
|
|
5
5
|
require_relative 'spec_helper'
|
6
|
-
require 'json'
|
7
6
|
require 'sinatra/strong-params'
|
8
7
|
|
9
8
|
describe Sinatra::StrongParams do
|
10
|
-
context
|
11
|
-
context
|
9
|
+
context 'using allows filter' do
|
10
|
+
context 'with no nested params' do
|
12
11
|
let(:request_params) { { id: 'id', action: 'action', not_allows: 'not_allows' } }
|
13
12
|
|
14
13
|
it 'supports accessing params with string keys' do
|
15
14
|
actual_params = nil
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
mock_registerd_app do
|
16
|
+
get '/', allows: [:id, :action] do
|
17
|
+
actual_params = params
|
18
|
+
end
|
19
19
|
end
|
20
20
|
|
21
21
|
get '/', request_params
|
@@ -26,9 +26,10 @@ describe Sinatra::StrongParams do
|
|
26
26
|
|
27
27
|
it 'supports accessing params with symbol keys' do
|
28
28
|
actual_params = nil
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
mock_registerd_app do
|
30
|
+
get '/', allows: [:id, :action] do
|
31
|
+
actual_params = params
|
32
|
+
end
|
32
33
|
end
|
33
34
|
|
34
35
|
get '/', request_params
|
@@ -38,14 +39,15 @@ describe Sinatra::StrongParams do
|
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
|
-
context
|
42
|
+
context 'with nested params' do
|
42
43
|
let(:request_params) { { id: [ { in_array: 'in_array'} ], action: { nested_hash: 'nested_hash'} }}
|
43
44
|
|
44
45
|
it 'supports accessing params with string keys' do
|
45
46
|
actual_params = nil
|
46
|
-
|
47
|
-
|
48
|
-
|
47
|
+
mock_registerd_app do
|
48
|
+
get '/', allows: [:id, :action] do
|
49
|
+
actual_params = params
|
50
|
+
end
|
49
51
|
end
|
50
52
|
|
51
53
|
get '/', request_params
|
@@ -55,9 +57,10 @@ describe Sinatra::StrongParams do
|
|
55
57
|
|
56
58
|
it 'supports accessing params with symbol keys' do
|
57
59
|
actual_params = nil
|
58
|
-
|
59
|
-
|
60
|
-
|
60
|
+
mock_registerd_app do
|
61
|
+
get '/', allows: [:id, :action] do
|
62
|
+
actual_params = params
|
63
|
+
end
|
61
64
|
end
|
62
65
|
|
63
66
|
get '/', request_params
|
@@ -67,31 +70,84 @@ describe Sinatra::StrongParams do
|
|
67
70
|
end
|
68
71
|
end
|
69
72
|
|
70
|
-
context
|
73
|
+
context 'using needs filter' do
|
74
|
+
let(:request_params) { { id: 'id', action: 'action' } }
|
75
|
+
|
71
76
|
it 'supports accessing params with string keys' do
|
72
77
|
actual_params = nil
|
73
|
-
|
74
|
-
|
75
|
-
|
78
|
+
mock_registerd_app do
|
79
|
+
get '/', needs: [:id, :action] do
|
80
|
+
actual_params = params
|
81
|
+
end
|
76
82
|
end
|
77
|
-
params = { id: 'id', action: 'action' }
|
78
83
|
|
79
|
-
get '/',
|
80
|
-
expect(actual_params['id']).to eq
|
81
|
-
expect(actual_params['action']).to eq
|
84
|
+
get '/', request_params
|
85
|
+
expect(actual_params['id']).to eq request_params[:id]
|
86
|
+
expect(actual_params['action']).to eq request_params[:action]
|
82
87
|
end
|
83
88
|
|
84
89
|
it 'supports accessing params with symbol keys' do
|
85
90
|
actual_params = nil
|
86
|
-
|
87
|
-
|
88
|
-
|
91
|
+
mock_registerd_app do
|
92
|
+
get '/', needs: [:id, :action] do
|
93
|
+
actual_params = params
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
get '/', request_params
|
98
|
+
expect(actual_params[:id]).to eq request_params[:id]
|
99
|
+
expect(actual_params[:action]).to eq request_params[:action]
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'with missing params' do
|
103
|
+
context 'and empty request' do
|
104
|
+
let(:request_params) { nil }
|
105
|
+
|
106
|
+
it 'return an error message with the missing keys on it' do
|
107
|
+
mock_registerd_app do
|
108
|
+
get '/', needs: [:id, :name, :action] do
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
get '/', request_params
|
113
|
+
expect(last_response.status).to eq 400
|
114
|
+
expect(last_response.body).to eq('One or more required parameters were missing: id, name, action')
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'and some params are present' do
|
119
|
+
let(:request_params) { { id: 'id', name: '' } }
|
120
|
+
|
121
|
+
it 'return an error message with the missing keys on it' do
|
122
|
+
mock_registerd_app do
|
123
|
+
get '/', needs: [:id, :name, :action] do
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
get '/', request_params
|
128
|
+
expect(last_response.status).to eq 400
|
129
|
+
expect(last_response.body).to eq('One or more required parameters were missing: name, action')
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'using allows and needs filter' do
|
136
|
+
let(:request_params) { { id: 'id', action: 'action', resource: 'resource', not_allows: 'not_allows' } }
|
137
|
+
|
138
|
+
it 'supports accessing params with string keys' do
|
139
|
+
actual_params = nil
|
140
|
+
mock_registerd_app do
|
141
|
+
get '/', needs: [:id, :action], allows: [:resource] do
|
142
|
+
actual_params = params
|
143
|
+
end
|
89
144
|
end
|
90
|
-
params = { id: 'id', action: 'action' }
|
91
145
|
|
92
|
-
get '/',
|
93
|
-
expect(actual_params[
|
94
|
-
expect(actual_params[
|
146
|
+
get '/', request_params
|
147
|
+
expect(actual_params['id']).to eq request_params[:id]
|
148
|
+
expect(actual_params['action']).to eq request_params[:action]
|
149
|
+
expect(actual_params['resource']).to eq request_params[:resource]
|
150
|
+
expect(actual_params['not_allows']).to eq nil
|
95
151
|
end
|
96
152
|
end
|
97
153
|
end
|
data/spec/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-strong-params
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Lecklider
|
8
|
+
- Gustavo Sobral
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2019-01-30 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: sinatra
|
@@ -80,14 +81,17 @@ dependencies:
|
|
80
81
|
- - ">="
|
81
82
|
- !ruby/object:Gem::Version
|
82
83
|
version: '0'
|
83
|
-
description:
|
84
|
+
description:
|
84
85
|
email:
|
85
86
|
- evan@lecklider.com
|
87
|
+
- ghsobral@gmail.com
|
86
88
|
executables: []
|
87
89
|
extensions: []
|
88
90
|
extra_rdoc_files: []
|
89
91
|
files:
|
90
92
|
- ".gitignore"
|
93
|
+
- ".travis.yml"
|
94
|
+
- CHANGELOG.md
|
91
95
|
- Gemfile
|
92
96
|
- LICENSE.txt
|
93
97
|
- README.md
|
@@ -117,11 +121,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
121
|
- !ruby/object:Gem::Version
|
118
122
|
version: '0'
|
119
123
|
requirements: []
|
120
|
-
|
121
|
-
rubygems_version: 2.6.10
|
124
|
+
rubygems_version: 3.0.2
|
122
125
|
signing_key:
|
123
126
|
specification_version: 4
|
124
|
-
summary:
|
127
|
+
summary: Basic strong parameter filters for Sinatra.
|
125
128
|
test_files:
|
126
129
|
- spec/spec_helper.rb
|
127
130
|
- spec/strong-params_spec.rb
|