sinatra_permitted_params 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 +7 -0
- data/.gitignore +23 -0
- data/Gemfile +3 -0
- data/README.md +87 -0
- data/lib/sinatra/permitted_params.rb +39 -0
- data/lib/sinatra_permitted_params/version.rb +3 -0
- data/sinatra_permitted_params.gemspec +28 -0
- data/spec/lib/sinatra/permitted_params_spec.rb +87 -0
- data/spec/spec_helper.rb +10 -0
- metadata +123 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 0a22fe1bbf20166d7c5b7ebb620e12f986636086
|
|
4
|
+
data.tar.gz: cb70f46f4041c5103088623d3c0e1727fa17c9bd
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 9514db54292e05bd0a1c7ed1adc3790a5903ef81f9035afb7c75dc257f961e82605e7da7d3679a305f00a705e5f6d4fece7dc6963d3a21fcdef4c98c33ba7230
|
|
7
|
+
data.tar.gz: 85cd550e530ccef75997dc3276fd8b12360f6570c15fc4826ac8ea0c154a073caf63ca627cff431315f851458dfe12bdb7c6bb5dc2f531fed123ffbaee32f13d
|
data/.gitignore
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
*.gem
|
|
2
|
+
*.rbc
|
|
3
|
+
.bundle
|
|
4
|
+
.config
|
|
5
|
+
.yardoc
|
|
6
|
+
Gemfile.lock
|
|
7
|
+
InstalledFiles
|
|
8
|
+
_yardoc
|
|
9
|
+
coverage
|
|
10
|
+
doc/
|
|
11
|
+
lib/bundler/man
|
|
12
|
+
pkg
|
|
13
|
+
rdoc
|
|
14
|
+
spec/reports
|
|
15
|
+
test/tmp
|
|
16
|
+
test/version_tmp
|
|
17
|
+
tmp
|
|
18
|
+
*.bundle
|
|
19
|
+
*.so
|
|
20
|
+
*.o
|
|
21
|
+
*.a
|
|
22
|
+
mkmf.log
|
|
23
|
+
vendor/bundle
|
data/Gemfile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# SinatraPermittedParams
|
|
2
|
+
|
|
3
|
+
A simple parameter filtering for Sinatra
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add this line to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
gem 'sinatra_permitted_params'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
And then execute:
|
|
14
|
+
|
|
15
|
+
$ bundle
|
|
16
|
+
|
|
17
|
+
Or install it yourself as:
|
|
18
|
+
|
|
19
|
+
$ gem install sinatra_permitted_params
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
This gems allows you to define your permitted params.
|
|
24
|
+
|
|
25
|
+
Add it as a helper in your sinatra App:
|
|
26
|
+
|
|
27
|
+
```ruby
|
|
28
|
+
require 'sinatra/base'
|
|
29
|
+
require 'sinatra/permitted_params'
|
|
30
|
+
|
|
31
|
+
class App < Sinatra::Base
|
|
32
|
+
helpers Sinatra::PermittedParams
|
|
33
|
+
#...
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
And define your permitted params:
|
|
37
|
+
|
|
38
|
+
```ruby
|
|
39
|
+
require 'sinatra/base'
|
|
40
|
+
require 'sinatra/permitted_params'
|
|
41
|
+
|
|
42
|
+
class App < Sinatra::Base
|
|
43
|
+
helpers Sinatra::PermittedParams
|
|
44
|
+
|
|
45
|
+
post '/comment' do
|
|
46
|
+
permitted_params = permitted_params([:title, :body])
|
|
47
|
+
comment = Comment.create(permitted_params)
|
|
48
|
+
|
|
49
|
+
#...
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# GET /comment?title=comment&body=new%20params%20gems
|
|
54
|
+
# GET /comment?title=comment&body=new%20params%20gems&user=new_user raises <Sinatra::PermittedParams::UnpermittedParamsError: Unpermitted params found: invalid>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
If a parameter different than the declared ones is received, then it raises a Sinatra::PermittedParams::UnpermittedParamsError.
|
|
58
|
+
|
|
59
|
+
Adding keys to the option 'ignore' allows you to define the params you want to filter without raising the error:
|
|
60
|
+
|
|
61
|
+
```ruby
|
|
62
|
+
post '/comment' do
|
|
63
|
+
permitted_params = permitted_params([:title, :body], ignore: [:user])
|
|
64
|
+
comment = Comment.create(permitted_params)
|
|
65
|
+
|
|
66
|
+
#...
|
|
67
|
+
end
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
In this case the param 'user' will be ignored, no error will be raised and
|
|
71
|
+
the permitted_params will return a hash with title and body.
|
|
72
|
+
|
|
73
|
+
You can intercept the error with a Sinatra ```error do...end``` block
|
|
74
|
+
|
|
75
|
+
```ruby
|
|
76
|
+
error Sinatra::PermittedParams::UnpermittedParamsError do
|
|
77
|
+
#...
|
|
78
|
+
end
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Contributing
|
|
82
|
+
|
|
83
|
+
1. Fork it ( https://github.com/[my-github-username]/sinatra_permitted_params/fork )
|
|
84
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
85
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
86
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
87
|
+
5. Create a new Pull Request
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'sinatra_permitted_params/version'
|
|
2
|
+
|
|
3
|
+
module Sinatra
|
|
4
|
+
module PermittedParams
|
|
5
|
+
class UnpermittedParamsError < StandardError; end
|
|
6
|
+
|
|
7
|
+
WILDCARD_PARAMS = ['splat', 'captures']
|
|
8
|
+
|
|
9
|
+
def permitted_params(permitted_keys, ignore: [])
|
|
10
|
+
ignored_keys = stringify(ignore)
|
|
11
|
+
permitted_keys = stringify(permitted_keys)
|
|
12
|
+
|
|
13
|
+
filtered_params = reject_ignored_params(ignored_keys)
|
|
14
|
+
|
|
15
|
+
check_params(filtered_params, permitted_keys)
|
|
16
|
+
|
|
17
|
+
filtered_params
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def reject_ignored_params(ignored_keys)
|
|
23
|
+
keys_to_ignore = ignored_keys + WILDCARD_PARAMS
|
|
24
|
+
|
|
25
|
+
params.reject { |key, _| keys_to_ignore.include?(key) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def check_params(filtered_params, permitted_keys)
|
|
29
|
+
forbidden_keys = filtered_params.keys - permitted_keys
|
|
30
|
+
return if forbidden_keys.empty?
|
|
31
|
+
|
|
32
|
+
raise UnpermittedParamsError.new("Unpermitted params found: #{forbidden_keys.join(', ')}")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def stringify(values)
|
|
36
|
+
values.map(&:to_s)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'sinatra_permitted_params/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = 'sinatra_permitted_params'
|
|
8
|
+
spec.version = SinatraPermittedParams::VERSION
|
|
9
|
+
spec.authors = ['peerTransfer tech']
|
|
10
|
+
spec.email = ['tech@peertransfer.com']
|
|
11
|
+
spec.summary = %q{A sinatra gem to filter params}
|
|
12
|
+
spec.description = %q{A sinatra gem to filter params}
|
|
13
|
+
|
|
14
|
+
files = Dir['lib/*.rb'] + Dir['lib/**/*.rb']
|
|
15
|
+
rootfiles = ['Gemfile', 'sinatra_permitted_params.gemspec', 'README.md']
|
|
16
|
+
dotfiles = ['.gitignore']
|
|
17
|
+
|
|
18
|
+
spec.files = files + rootfiles + dotfiles
|
|
19
|
+
spec.test_files = Dir['spec/*.rb'] + Dir['spec/**/*.rb']
|
|
20
|
+
spec.require_paths = ['lib']
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
spec.add_development_dependency 'sinatra', '~> 1.3'
|
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
|
25
|
+
spec.add_development_dependency 'rake'
|
|
26
|
+
spec.add_development_dependency 'rspec'
|
|
27
|
+
spec.add_development_dependency 'rack-test'
|
|
28
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Sinatra::PermittedParams do
|
|
4
|
+
include Rack::Test::Methods
|
|
5
|
+
|
|
6
|
+
class Dummy
|
|
7
|
+
def self.foo(params); end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class DummyController < Sinatra::Base
|
|
11
|
+
helpers Sinatra::PermittedParams
|
|
12
|
+
|
|
13
|
+
post '/test_permitted_params' do
|
|
14
|
+
Dummy.foo(testing_permitted_params)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
get '/test_ignored_params' do
|
|
18
|
+
Dummy.foo(testing_ignored_params)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
put '/test_wildcard_params/:id' do
|
|
22
|
+
Dummy.foo(test_wildcard_params)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def testing_permitted_params
|
|
26
|
+
permitted_params([:name, :code])
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def testing_ignored_params
|
|
30
|
+
permitted_params([:name, :code], ignore: [:address])
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_wildcard_params
|
|
34
|
+
permitted_params([:id, :name, :code])
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
context 'when the request contains only permitted params' do
|
|
40
|
+
it 'does not raise an error' do
|
|
41
|
+
attributes = { 'name' => 'Joe', 'code' => 'ERF' }
|
|
42
|
+
|
|
43
|
+
expect(Dummy).to receive(:foo).with(attributes)
|
|
44
|
+
|
|
45
|
+
post '/test_permitted_params', attributes
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context 'when the request contains a not permitted param' do
|
|
50
|
+
it 'raises an error' do
|
|
51
|
+
expect do
|
|
52
|
+
post '/test_permitted_params', 'invalid' => 'param'
|
|
53
|
+
end.to raise_error(
|
|
54
|
+
Sinatra::PermittedParams::UnpermittedParamsError,
|
|
55
|
+
'Unpermitted params found: invalid'
|
|
56
|
+
)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context 'when there are keys to ignore' do
|
|
61
|
+
it 'filters the declared params to ignore' do
|
|
62
|
+
attributes = { 'name' => 'Joe', 'code' => 'ERF', 'address' => 'Av. Aragon' }
|
|
63
|
+
expected_attributes = attributes.delete_if { |k, _| k == 'address' }
|
|
64
|
+
|
|
65
|
+
expect(Dummy).to receive(:foo).with(expected_attributes)
|
|
66
|
+
|
|
67
|
+
get '/test_ignored_params', attributes
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context 'when the request contains splat or wildcard parameters' do
|
|
72
|
+
context 'when wildcard parameters (splat & captures) are not defined as permitted' do
|
|
73
|
+
it 'does not raise an error' do
|
|
74
|
+
attributes = { 'name' => 'Joe', 'code' => 'ERF' }
|
|
75
|
+
expected_attributes = attributes.merge('id' => '5')
|
|
76
|
+
|
|
77
|
+
expect(Dummy).to receive(:foo).with(expected_attributes)
|
|
78
|
+
|
|
79
|
+
put '/test_wildcard_params/5', attributes
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def app
|
|
86
|
+
DummyController.new
|
|
87
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: sinatra_permitted_params
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- peerTransfer tech
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-03-01 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: sinatra
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.3'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.3'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: bundler
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '1.7'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '1.7'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rake
|
|
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: rspec
|
|
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: rack-test
|
|
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: A sinatra gem to filter params
|
|
84
|
+
email:
|
|
85
|
+
- tech@peertransfer.com
|
|
86
|
+
executables: []
|
|
87
|
+
extensions: []
|
|
88
|
+
extra_rdoc_files: []
|
|
89
|
+
files:
|
|
90
|
+
- ".gitignore"
|
|
91
|
+
- Gemfile
|
|
92
|
+
- README.md
|
|
93
|
+
- lib/sinatra/permitted_params.rb
|
|
94
|
+
- lib/sinatra_permitted_params/version.rb
|
|
95
|
+
- sinatra_permitted_params.gemspec
|
|
96
|
+
- spec/lib/sinatra/permitted_params_spec.rb
|
|
97
|
+
- spec/spec_helper.rb
|
|
98
|
+
homepage:
|
|
99
|
+
licenses: []
|
|
100
|
+
metadata: {}
|
|
101
|
+
post_install_message:
|
|
102
|
+
rdoc_options: []
|
|
103
|
+
require_paths:
|
|
104
|
+
- lib
|
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - ">="
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '0'
|
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
|
+
requirements:
|
|
112
|
+
- - ">="
|
|
113
|
+
- !ruby/object:Gem::Version
|
|
114
|
+
version: '0'
|
|
115
|
+
requirements: []
|
|
116
|
+
rubyforge_project:
|
|
117
|
+
rubygems_version: 2.4.5
|
|
118
|
+
signing_key:
|
|
119
|
+
specification_version: 4
|
|
120
|
+
summary: A sinatra gem to filter params
|
|
121
|
+
test_files:
|
|
122
|
+
- spec/spec_helper.rb
|
|
123
|
+
- spec/lib/sinatra/permitted_params_spec.rb
|