sanitization 1.0.2 → 1.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 +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/README.md +39 -5
- data/lib/sanitization.rb +1 -0
- data/lib/sanitization/active_record_extension.rb +21 -11
- data/lib/sanitization/configuration.rb +64 -0
- data/lib/sanitization/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7df5efc0b65948fd54d88ac7c8f90751d86fe451fe13e89708fac01acc0eead6
|
4
|
+
data.tar.gz: da8dbd58e672ea0919a8d2f5952801866c14edb054cc25d643af05b0c87cbfb9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff7a7568225361dc64f8e18ea00adeefc6e6ba468ae9233a9518e6c8dc83f880c51b5b6c16c54a6d5f695493e3393f0fd54dd34a0a3ea666c91fdb84d4207c1f
|
7
|
+
data.tar.gz: d89eb17b76a4c2dbe2cfe90457728bc795a46fb56a47c07b2ce2bbfa5c2245f1f0f56ec9bb3b8050d468e4e2c598ee6335efdaa6d26eb6477b949c948c5be83b
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
# 1.1.0
|
2
|
+
* **BREAKING CHANGE:** By default, Sanitization now does nothing. A configuration block should be used to set your desired defaults. Add `Sanitization.simple_defaults!` to `config/initializers/sanitization.rb` for version 1.0.x defaults.
|
3
|
+
* Added support for configuration block.
|
4
|
+
|
5
|
+
|
6
|
+
# 1.0.0
|
7
|
+
* Initial Release
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
Sanitization makes it easy to store slightly cleaner strings to your database.
|
4
4
|
|
5
|
+
|
5
6
|
### Features (all optional):
|
6
7
|
|
7
8
|
- White space stripping
|
@@ -9,14 +10,37 @@ Sanitization makes it easy to store slightly cleaner strings to your database.
|
|
9
10
|
- Empty string to nil (if database column supports it)
|
10
11
|
- Change casing (ie. upcase, downcase, titlecase, etc)
|
11
12
|
|
13
|
+
|
12
14
|
### Defaults
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
By default, Sanitization has all options disabled. It is recommended you use a configuration block to set
|
17
|
+
sensitive defaults for your projects.
|
18
|
+
|
19
|
+
For example, I use:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
# config/initializers/sanitization.rb
|
23
|
+
|
24
|
+
Sanitization.configure do |config|
|
25
|
+
config.strip = true
|
26
|
+
config.collapse = true
|
27
|
+
config.nullify = true
|
28
|
+
end
|
29
|
+
|
30
|
+
# or you can use the following shortcut instead:
|
31
|
+
|
32
|
+
Sanitization.simple_defaults!
|
33
|
+
```
|
34
|
+
|
35
|
+
|
36
|
+
### Configuration Options
|
37
|
+
|
38
|
+
- Strip leading & training white spaces (`strip: true|false`)
|
39
|
+
- Collapse consecutive spaces (`collapse: true|false`)
|
40
|
+
- Store empty strings as `null` if the database column allows it (`nullify: true|false`)
|
17
41
|
- All String columns are sanitized (`only: nil, except: nil`)
|
18
|
-
-
|
19
|
-
-
|
42
|
+
- Also sanitize strings of type `text` (`include_text_type: true|false`)
|
43
|
+
- Change casing: (`case: :none|:up|:down|:custom`)
|
20
44
|
|
21
45
|
|
22
46
|
## Installation
|
@@ -29,6 +53,14 @@ bundle add sanitization
|
|
29
53
|
## Usage
|
30
54
|
|
31
55
|
```ruby
|
56
|
+
|
57
|
+
# Assuming the following configuration block:
|
58
|
+
Sanitization.configure do |config|
|
59
|
+
config.strip = true
|
60
|
+
config.collapse = true
|
61
|
+
config.nullify = true
|
62
|
+
end
|
63
|
+
|
32
64
|
# Default settings for all strings
|
33
65
|
class Person < ApplicationModel
|
34
66
|
sanitization
|
@@ -70,10 +102,12 @@ end
|
|
70
102
|
|
71
103
|
```
|
72
104
|
|
105
|
+
|
73
106
|
## Development
|
74
107
|
|
75
108
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
76
109
|
|
110
|
+
|
77
111
|
## License
|
78
112
|
|
79
113
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/lib/sanitization.rb
CHANGED
@@ -15,11 +15,8 @@ module Sanitization
|
|
15
15
|
|
16
16
|
self.sanitization__store ||= {}
|
17
17
|
|
18
|
-
options[:only]
|
19
|
-
options[:except]
|
20
|
-
options[:strip] = !!(options[:strip].nil? ? true : options[:strip])
|
21
|
-
options[:collapse] = !!(options[:collapse].nil? ? true : options[:collapse])
|
22
|
-
options[:nullify] = !!(options[:nullify].nil? ? true : options[:nullify])
|
18
|
+
options[:only] = Array.wrap(options[:only])
|
19
|
+
options[:except] = Array.wrap(options[:except])
|
23
20
|
|
24
21
|
unless options[:case].nil?
|
25
22
|
raise ArgumentError.new("Invalid type for `case`: #{options[:case].class}") \
|
@@ -41,8 +38,9 @@ module Sanitization
|
|
41
38
|
end
|
42
39
|
|
43
40
|
if options[:case]
|
44
|
-
raise ArgumentError.new("Method not found: `:#{options[:case]}`.
|
45
|
-
|
41
|
+
raise ArgumentError.new("Method not found: `:#{options[:case]}`. " +
|
42
|
+
"Valid methods are: :#{valid_case_methods.join(', :')}") \
|
43
|
+
unless valid_case_methods.include?(options[:case]) || options[:case] == :none
|
46
44
|
end
|
47
45
|
|
48
46
|
columns_to_format.each do |col|
|
@@ -95,9 +93,9 @@ module Sanitization
|
|
95
93
|
def sanitization__format_column(col_name, col_formatting)
|
96
94
|
return unless self[col_name].is_a?(String)
|
97
95
|
|
98
|
-
self[col_name].strip! if col_formatting
|
96
|
+
self[col_name].strip! if value_or_default(col_formatting, :strip)
|
99
97
|
|
100
|
-
if col_formatting
|
98
|
+
if value_or_default(col_formatting, :collapse)
|
101
99
|
if MULTIBYTE_SUPPORTED && Encoding.compatible?(self[col_name], MULTIBYTE_BLANK)
|
102
100
|
self[col_name].gsub!(/#{MULTIBYTE_BLANK}+/, " ")
|
103
101
|
else
|
@@ -105,15 +103,27 @@ module Sanitization
|
|
105
103
|
end
|
106
104
|
end
|
107
105
|
|
108
|
-
if col_formatting
|
106
|
+
if value_or_default(col_formatting, :nullify) && !self[col_name].nil? && self[col_name].to_s.empty? && \
|
109
107
|
self.class.columns.select { |c| c.name == col_name }.first.null
|
110
108
|
return self[col_name] = nil
|
111
109
|
end
|
112
110
|
|
113
|
-
|
111
|
+
case_formatting_method = value_or_default(col_formatting, :case)
|
112
|
+
if !case_formatting_method.nil? && case_formatting_method != :none
|
113
|
+
self[col_name] = self[col_name].send(case_formatting_method)
|
114
|
+
end
|
115
|
+
|
114
116
|
self[col_name]
|
115
117
|
end
|
116
118
|
|
119
|
+
def value_or_default(col_formatting, transform)
|
120
|
+
if col_formatting[transform].nil?
|
121
|
+
Sanitization.configuration[transform]
|
122
|
+
else
|
123
|
+
col_formatting[transform]
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
117
127
|
|
118
128
|
end # module InstanceMethods
|
119
129
|
end # module ActiveRecordExt
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Sanitization
|
2
|
+
class << self
|
3
|
+
def configuration
|
4
|
+
@configuration ||= Configuration.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def configuration=(c)
|
8
|
+
@configuration = c
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.configure
|
13
|
+
yield(configuration)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.simple_defaults!
|
17
|
+
self.configuration.simple!
|
18
|
+
end
|
19
|
+
|
20
|
+
class Configuration
|
21
|
+
DEFAULTS = {
|
22
|
+
strip: false,
|
23
|
+
collapse: false,
|
24
|
+
case: :none,
|
25
|
+
nullify: false,
|
26
|
+
include_text_type: false
|
27
|
+
}
|
28
|
+
|
29
|
+
SIMPLE_DEFAULTS = {
|
30
|
+
strip: true,
|
31
|
+
collapse: true,
|
32
|
+
case: :none,
|
33
|
+
nullify: true,
|
34
|
+
include_text_type: false
|
35
|
+
}
|
36
|
+
|
37
|
+
attr_accessor *DEFAULTS.keys
|
38
|
+
|
39
|
+
def initialize(opts = {})
|
40
|
+
opts = DEFAULTS.merge((opts || {}).slice(DEFAULTS.keys))
|
41
|
+
|
42
|
+
opts.each_pair do |k,v|
|
43
|
+
self.instance_variable_set("@#{k}", v)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def [](k)
|
48
|
+
raise ArgumentError.new("Invalid parameter: #{k}") unless DEFAULTS.keys.include?(k)
|
49
|
+
self.instance_variable_get("@#{k}")
|
50
|
+
end
|
51
|
+
|
52
|
+
def clear!
|
53
|
+
DEFAULTS.each_pair do |k,v|
|
54
|
+
self.instance_variable_set("@#{k}", v)
|
55
|
+
end; self
|
56
|
+
end
|
57
|
+
|
58
|
+
def simple!
|
59
|
+
SIMPLE_DEFAULTS.each_pair do |k,v|
|
60
|
+
self.instance_variable_set("@#{k}", v)
|
61
|
+
end; self
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/sanitization/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sanitization
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carl Mercier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-05-
|
11
|
+
date: 2021-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -47,6 +47,7 @@ extra_rdoc_files: []
|
|
47
47
|
files:
|
48
48
|
- ".gitignore"
|
49
49
|
- ".rspec"
|
50
|
+
- CHANGELOG.md
|
50
51
|
- Gemfile
|
51
52
|
- Gemfile.lock
|
52
53
|
- LICENSE.txt
|
@@ -56,6 +57,7 @@ files:
|
|
56
57
|
- bin/setup
|
57
58
|
- lib/sanitization.rb
|
58
59
|
- lib/sanitization/active_record_extension.rb
|
60
|
+
- lib/sanitization/configuration.rb
|
59
61
|
- lib/sanitization/version.rb
|
60
62
|
- sanitization.gemspec
|
61
63
|
homepage: https://github.com/cmer/sanitization
|
@@ -81,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
83
|
- !ruby/object:Gem::Version
|
82
84
|
version: '0'
|
83
85
|
requirements: []
|
84
|
-
rubygems_version: 3.1.
|
86
|
+
rubygems_version: 3.1.4
|
85
87
|
signing_key:
|
86
88
|
specification_version: 4
|
87
89
|
summary: ''
|