attributes_sanitizer 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +57 -0
- data/Rakefile +27 -0
- data/lib/attributes_sanitizer/concern.rb +50 -0
- data/lib/attributes_sanitizer/overrider.rb +49 -0
- data/lib/attributes_sanitizer/predefined.rb +28 -0
- data/lib/attributes_sanitizer/railtie.rb +4 -0
- data/lib/attributes_sanitizer/sanitizer_proc.rb +29 -0
- data/lib/attributes_sanitizer/version.rb +3 -0
- data/lib/attributes_sanitizer.rb +51 -0
- data/lib/tasks/attributes_sanitizer_tasks.rake +4 -0
- metadata +86 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7293d638b6f0162ea95543f432fcae6150687b1a87aad503f3f57950c278b92e
|
4
|
+
data.tar.gz: 7c8046d3f6435c229607b336031164f63761c8b58ac7eaafa99f45bcabf3d18e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 81920cb935016e60767ae442105fe540451d700ba3567dd6c611d81b7ab319860ff89ca4f08dd7275bcf65985f164e162220d10214ca2d894205c41daff33779
|
7
|
+
data.tar.gz: 051514ccb49100577fcd88ea6bd53d83f1581e2c5c63fc99da1195d8afe8007f080d86915fc519c66b17365b28ac895fb3b35c84a287337164ba9a592ebddd04
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2018 Anderson Dias
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/29a55c3bd2dd9e5ed117/maintainability)](https://codeclimate.com/github/andersondias/attributes_sanitizer/maintainability)
|
2
|
+
|
3
|
+
# AttributesSanitizer
|
4
|
+
|
5
|
+
A simple way to append sanitizers to attributes on Rails.
|
6
|
+
|
7
|
+
|
8
|
+
## Usage
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
class Product < ApplicationRecord
|
12
|
+
extend AttributesSanitizer::Concern
|
13
|
+
|
14
|
+
sanitize_attribute :title, with: -> (value) {
|
15
|
+
value.gsub(/[1-9]/, 'X')
|
16
|
+
}
|
17
|
+
|
18
|
+
sanitize_attributes :title, :description, with: [:downcase, :strip_tags]
|
19
|
+
end
|
20
|
+
```
|
21
|
+
|
22
|
+
It comes with pre-defined sanitizers:
|
23
|
+
- `:downcase` which downcases a given attribute string
|
24
|
+
- `:upcase` which upcases a given attribute string
|
25
|
+
- `:strip_tags` which removes any tags from the given string based on Rails sanitize helper.
|
26
|
+
- `:strip_emojis` which removes any emoji from the given string
|
27
|
+
- `:strip_spaces` which removes any white spaces from the beginning and end of given attribute
|
28
|
+
|
29
|
+
You might define your own sanitizers:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
# config/initializers/attribute_sanitizers.rb
|
33
|
+
|
34
|
+
AttributesSanitizer.define_sanitizer :reverse do |value|
|
35
|
+
value.to_s.reverse
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
39
|
+
## Installation
|
40
|
+
Add this line to your application's Gemfile:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
gem 'attributes_sanitizer', git: 'https://github.com/andersondias/attributes_sanitizer.git'
|
44
|
+
```
|
45
|
+
|
46
|
+
And then execute:
|
47
|
+
```bash
|
48
|
+
$ bundle
|
49
|
+
```
|
50
|
+
|
51
|
+
Or install it yourself as:
|
52
|
+
```bash
|
53
|
+
$ gem install attributes_sanitizer
|
54
|
+
```
|
55
|
+
|
56
|
+
## License
|
57
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'AttributesSanitizer'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'bundler/gem_tasks'
|
18
|
+
|
19
|
+
require 'rake/testtask'
|
20
|
+
|
21
|
+
Rake::TestTask.new(:test) do |t|
|
22
|
+
t.libs << 'test'
|
23
|
+
t.pattern = 'test/**/*_test.rb'
|
24
|
+
t.verbose = false
|
25
|
+
end
|
26
|
+
|
27
|
+
task default: :test
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module AttributesSanitizer::Concern
|
2
|
+
def self.extended(klass)
|
3
|
+
klass.cattr_accessor :attributes_sanitize_map
|
4
|
+
klass.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def sanitize_attributes(*attributes)
|
9
|
+
self.attributes_sanitize_map ||= {}
|
10
|
+
|
11
|
+
fetch_sanitizers_from_options(attributes).each do |sanitizer|
|
12
|
+
sanitizer = AttributesSanitizer::SanitizerProc.new(sanitizer)
|
13
|
+
|
14
|
+
attributes.each do |attribute|
|
15
|
+
add_sanitizer_to_attribute(attribute, sanitizer)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
AttributesSanitizer::Overrider.new(self).override_getters_and_setters
|
20
|
+
end
|
21
|
+
alias_method :sanitize_attribute, :sanitize_attributes
|
22
|
+
|
23
|
+
def execute_sanitizers_for(attribute, value)
|
24
|
+
return value if self.attributes_sanitize_map.blank? || value.nil?
|
25
|
+
|
26
|
+
self.attributes_sanitize_map[attribute].reduce(value) do |value, sanitizer|
|
27
|
+
sanitizer.call(value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def fetch_sanitizers_from_options(attributes)
|
34
|
+
defaults = attributes.extract_options!.dup
|
35
|
+
sanitizers = Array(defaults[:with])
|
36
|
+
|
37
|
+
raise ArgumentError, "You need to supply at least one attribute" if attributes.empty?
|
38
|
+
raise ArgumentError, "You need to supply at least one sanitize method" if sanitizers.empty?
|
39
|
+
|
40
|
+
sanitizers
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_sanitizer_to_attribute(attribute, sanitizer)
|
44
|
+
self.attributes_sanitize_map[attribute] ||= []
|
45
|
+
unless self.attributes_sanitize_map[attribute].include?(sanitizer)
|
46
|
+
self.attributes_sanitize_map[attribute] << sanitizer
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module AttributesSanitizer
|
2
|
+
class Overrider
|
3
|
+
attr_reader :klass
|
4
|
+
|
5
|
+
def initialize(klass)
|
6
|
+
@klass = klass
|
7
|
+
end
|
8
|
+
|
9
|
+
def override_getters_and_setters
|
10
|
+
return if klass.attributes_sanitize_map.blank?
|
11
|
+
|
12
|
+
attributes_to_override.each do |attribute|
|
13
|
+
override_getter(attribute)
|
14
|
+
override_setter(attribute)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def attributes_to_override
|
21
|
+
klass.attributes_sanitize_map.keys
|
22
|
+
end
|
23
|
+
|
24
|
+
def override_method(method_name, &block)
|
25
|
+
return if klass.method_defined?(method_name)
|
26
|
+
klass.define_method(method_name, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def override_getter(attribute)
|
30
|
+
getter = attribute.to_sym
|
31
|
+
override_method(getter) do
|
32
|
+
attribute_value = self[getter.to_s]
|
33
|
+
return if attribute_value.nil?
|
34
|
+
|
35
|
+
self.class.execute_sanitizers_for(attribute, attribute_value)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def override_setter(attribute)
|
40
|
+
override_method(:"#{attribute}=") do |new_value|
|
41
|
+
if new_value.present?
|
42
|
+
new_value = self.class.execute_sanitizers_for(attribute, new_value)
|
43
|
+
end
|
44
|
+
|
45
|
+
super(new_value)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module AttributesSanitizer
|
2
|
+
module Predefined
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
AttributesSanitizer.define_sanitizer :downcase do |value|
|
7
|
+
value.downcase
|
8
|
+
end
|
9
|
+
|
10
|
+
AttributesSanitizer.define_sanitizer :upcase do |value|
|
11
|
+
value.upcase
|
12
|
+
end
|
13
|
+
|
14
|
+
AttributesSanitizer.define_sanitizer :strip_tags do |value|
|
15
|
+
ActionController::Base.helpers.sanitize(value, tags: [])
|
16
|
+
end
|
17
|
+
|
18
|
+
AttributesSanitizer.define_sanitizer :strip_emojis do |value|
|
19
|
+
value.gsub(AttributesSanitizer::EMOJI_REGEX, '')
|
20
|
+
end
|
21
|
+
|
22
|
+
AttributesSanitizer.define_sanitizer :strip_spaces do |value|
|
23
|
+
value.strip
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module AttributesSanitizer
|
2
|
+
class SanitizerProc
|
3
|
+
include Comparable
|
4
|
+
|
5
|
+
attr_reader :id
|
6
|
+
|
7
|
+
def initialize(sanitizer)
|
8
|
+
raise ArgumentError, "No sanitizer given" if sanitizer.nil?
|
9
|
+
|
10
|
+
if sanitizer.is_a?(Proc)
|
11
|
+
@proc = sanitizer
|
12
|
+
@id = sanitizer.object_id
|
13
|
+
else
|
14
|
+
@proc = AttributesSanitizer.sanitizers[sanitizer]
|
15
|
+
raise ArgumentError, "No attribute sanitizer defined for #{sanitizer}" if @proc.nil?
|
16
|
+
|
17
|
+
@id = sanitizer
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def <=>(another_proc)
|
22
|
+
self.id <=> another_proc.id
|
23
|
+
end
|
24
|
+
|
25
|
+
def call(value)
|
26
|
+
@proc.call(value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "attributes_sanitizer/railtie"
|
2
|
+
require "attributes_sanitizer/sanitizer_proc"
|
3
|
+
require "attributes_sanitizer/concern"
|
4
|
+
require "attributes_sanitizer/overrider"
|
5
|
+
require "attributes_sanitizer/predefined"
|
6
|
+
|
7
|
+
#
|
8
|
+
# Attributes sanitizer for Rails
|
9
|
+
#
|
10
|
+
# A simple way to append sanitizers to attributes on Rails.
|
11
|
+
#
|
12
|
+
# ```ruby
|
13
|
+
# class Product < ApplicationRecord
|
14
|
+
# extend AttributesSanitizer::Concern
|
15
|
+
#
|
16
|
+
# sanitize_attribute :title, with: -> (value) {
|
17
|
+
# value.gsub(/[1-9]/, 'X')
|
18
|
+
# }
|
19
|
+
#
|
20
|
+
# sanitize_attributes :title, :description, with: [:downcase, :strip_tags]
|
21
|
+
# end
|
22
|
+
# ```
|
23
|
+
#
|
24
|
+
# It comes with pre-defined sanitizers:
|
25
|
+
# - `:downcase` which downcases a given attribute string
|
26
|
+
# - `:upcase` which upcases a given attribute string
|
27
|
+
# - `:strip_tags` which removes any tags from the given string based on Rails sanitize helper.
|
28
|
+
# - `:strip_emojis` which removes any emoji from the given string
|
29
|
+
# - `:strip_spaces` which removes any white spaces from the beginning and end of given attribute
|
30
|
+
#
|
31
|
+
# You might define your own sanitizers:
|
32
|
+
#
|
33
|
+
# ```ruby
|
34
|
+
# # config/initializers/attribute_sanitizers.rb
|
35
|
+
#
|
36
|
+
# AttributesSanitizer.define_sanitizer :reverse do |value|
|
37
|
+
# value.to_s.reverse
|
38
|
+
# end
|
39
|
+
# ```
|
40
|
+
module AttributesSanitizer
|
41
|
+
EMOJI_REGEX = /[^\u0000-\u00FF]/
|
42
|
+
|
43
|
+
cattr_accessor :sanitizers
|
44
|
+
self.sanitizers = {}
|
45
|
+
|
46
|
+
def self.define_sanitizer(sanitizer_name, &block)
|
47
|
+
self.sanitizers[sanitizer_name.to_sym] = block
|
48
|
+
end
|
49
|
+
|
50
|
+
include Predefined
|
51
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: attributes_sanitizer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Anderson Dias
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sqlite3
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: A simple way to append sanitizers to attributes on Rails.
|
42
|
+
email:
|
43
|
+
- andersondaraujo@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- MIT-LICENSE
|
49
|
+
- README.md
|
50
|
+
- Rakefile
|
51
|
+
- lib/attributes_sanitizer.rb
|
52
|
+
- lib/attributes_sanitizer/concern.rb
|
53
|
+
- lib/attributes_sanitizer/overrider.rb
|
54
|
+
- lib/attributes_sanitizer/predefined.rb
|
55
|
+
- lib/attributes_sanitizer/railtie.rb
|
56
|
+
- lib/attributes_sanitizer/sanitizer_proc.rb
|
57
|
+
- lib/attributes_sanitizer/version.rb
|
58
|
+
- lib/tasks/attributes_sanitizer_tasks.rake
|
59
|
+
homepage: https://github.com/andersondias/attributes_sanitizer
|
60
|
+
licenses:
|
61
|
+
- MIT
|
62
|
+
metadata:
|
63
|
+
changelog_uri: https://github.com/andersondias/attributes_sanitizer/blob/master/CHANGELOG.md
|
64
|
+
homepage_uri: https://github.com/andersondias/attributes_sanitizer
|
65
|
+
source_code_uri: https://github.com/andersondias/attributes_sanitizer
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 2.7.7
|
83
|
+
signing_key:
|
84
|
+
specification_version: 4
|
85
|
+
summary: Attributes sanitizer for Rails 5+.
|
86
|
+
test_files: []
|