input_sanitizer 0.1.9 → 0.4.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.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/gempush.yml +28 -0
  3. data/.gitignore +2 -1
  4. data/.travis.yml +4 -8
  5. data/CHANGELOG +96 -0
  6. data/LICENSE +201 -22
  7. data/README.md +22 -3
  8. data/input_sanitizer.gemspec +10 -4
  9. data/lib/input_sanitizer.rb +5 -2
  10. data/lib/input_sanitizer/errors.rb +142 -0
  11. data/lib/input_sanitizer/extended_converters.rb +5 -52
  12. data/lib/input_sanitizer/extended_converters/comma_joined_integers_converter.rb +15 -0
  13. data/lib/input_sanitizer/extended_converters/comma_joined_strings_converter.rb +15 -0
  14. data/lib/input_sanitizer/extended_converters/positive_integer_converter.rb +12 -0
  15. data/lib/input_sanitizer/extended_converters/specific_values_converter.rb +19 -0
  16. data/lib/input_sanitizer/restricted_hash.rb +49 -8
  17. data/lib/input_sanitizer/v1.rb +22 -0
  18. data/lib/input_sanitizer/v1/clean_field.rb +38 -0
  19. data/lib/input_sanitizer/{default_converters.rb → v1/default_converters.rb} +30 -13
  20. data/lib/input_sanitizer/v1/sanitizer.rb +166 -0
  21. data/lib/input_sanitizer/v2.rb +13 -0
  22. data/lib/input_sanitizer/v2/clean_field.rb +36 -0
  23. data/lib/input_sanitizer/v2/clean_payload_collection_field.rb +41 -0
  24. data/lib/input_sanitizer/v2/clean_query_collection_field.rb +40 -0
  25. data/lib/input_sanitizer/v2/error_collection.rb +49 -0
  26. data/lib/input_sanitizer/v2/nested_sanitizer_factory.rb +19 -0
  27. data/lib/input_sanitizer/v2/payload_sanitizer.rb +130 -0
  28. data/lib/input_sanitizer/v2/payload_transform.rb +42 -0
  29. data/lib/input_sanitizer/v2/query_sanitizer.rb +33 -0
  30. data/lib/input_sanitizer/v2/types.rb +213 -0
  31. data/lib/input_sanitizer/version.rb +1 -1
  32. data/spec/extended_converters/comma_joined_integers_converter_spec.rb +18 -0
  33. data/spec/extended_converters/comma_joined_strings_converter_spec.rb +18 -0
  34. data/spec/extended_converters/positive_integer_converter_spec.rb +18 -0
  35. data/spec/extended_converters/specific_values_converter_spec.rb +27 -0
  36. data/spec/restricted_hash_spec.rb +37 -7
  37. data/spec/sanitizer_spec.rb +129 -26
  38. data/spec/spec_helper.rb +17 -2
  39. data/spec/v1/default_converters_spec.rb +141 -0
  40. data/spec/v2/converters_spec.rb +174 -0
  41. data/spec/v2/payload_sanitizer_spec.rb +460 -0
  42. data/spec/v2/payload_transform_spec.rb +98 -0
  43. data/spec/v2/query_sanitizer_spec.rb +300 -0
  44. data/v2.md +52 -0
  45. metadata +105 -40
  46. data/lib/input_sanitizer/sanitizer.rb +0 -152
  47. data/spec/default_converters_spec.rb +0 -101
  48. data/spec/extended_converters_spec.rb +0 -62
metadata CHANGED
@@ -1,106 +1,171 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: input_sanitizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
5
- prerelease:
4
+ version: 0.4.0
6
5
  platform: ruby
7
6
  authors:
8
- - Tomek Paczkowski
9
- - Tomasz Werbicki
10
- - Michal Bugno
7
+ - Zendesk
11
8
  autorequire:
12
9
  bindir: bin
13
10
  cert_chain: []
14
- date: 2013-05-13 00:00:00.000000000 Z
11
+ date: 2020-08-20 00:00:00.000000000 Z
15
12
  dependencies:
16
13
  - !ruby/object:Gem::Dependency
17
- name: rspec
14
+ name: method_struct
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.2.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.2.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
18
29
  requirement: !ruby/object:Gem::Requirement
19
- none: false
20
30
  requirements:
21
- - - ! '>='
31
+ - - ">="
22
32
  - !ruby/object:Gem::Version
23
- version: '0'
33
+ version: 3.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.10.1
24
48
  type: :development
25
49
  prerelease: false
26
50
  version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
51
  requirements:
29
- - - ! '>='
52
+ - - "~>"
30
53
  - !ruby/object:Gem::Version
31
- version: '0'
54
+ version: 0.10.1
32
55
  - !ruby/object:Gem::Dependency
33
56
  name: simplecov
34
57
  requirement: !ruby/object:Gem::Requirement
35
- none: false
36
58
  requirements:
37
- - - ! '>='
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.9.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
38
74
  - !ruby/object:Gem::Version
39
- version: '0'
75
+ version: 3.2.0
40
76
  type: :development
41
77
  prerelease: false
42
78
  version_requirements: !ruby/object:Gem::Requirement
43
- none: false
44
79
  requirements:
45
- - - ! '>='
80
+ - - "~>"
46
81
  - !ruby/object:Gem::Version
47
- version: '0'
82
+ version: 3.2.0
48
83
  description: Gem to sanitize hash of incoming data
49
84
  email:
50
- - tom@futuresimple.com
51
- - tomasz@futuresimple.com
52
- - michal@futuresimple.com
85
+ - opensource@zendesk.com
53
86
  executables: []
54
87
  extensions: []
55
88
  extra_rdoc_files: []
56
89
  files:
57
- - .gitignore
58
- - .rspec
59
- - .travis.yml
90
+ - ".github/workflows/gempush.yml"
91
+ - ".gitignore"
92
+ - ".rspec"
93
+ - ".travis.yml"
94
+ - CHANGELOG
60
95
  - Gemfile
61
96
  - LICENSE
62
97
  - README.md
63
98
  - Rakefile
64
99
  - input_sanitizer.gemspec
65
100
  - lib/input_sanitizer.rb
66
- - lib/input_sanitizer/default_converters.rb
101
+ - lib/input_sanitizer/errors.rb
67
102
  - lib/input_sanitizer/extended_converters.rb
103
+ - lib/input_sanitizer/extended_converters/comma_joined_integers_converter.rb
104
+ - lib/input_sanitizer/extended_converters/comma_joined_strings_converter.rb
105
+ - lib/input_sanitizer/extended_converters/positive_integer_converter.rb
106
+ - lib/input_sanitizer/extended_converters/specific_values_converter.rb
68
107
  - lib/input_sanitizer/restricted_hash.rb
69
- - lib/input_sanitizer/sanitizer.rb
108
+ - lib/input_sanitizer/v1.rb
109
+ - lib/input_sanitizer/v1/clean_field.rb
110
+ - lib/input_sanitizer/v1/default_converters.rb
111
+ - lib/input_sanitizer/v1/sanitizer.rb
112
+ - lib/input_sanitizer/v2.rb
113
+ - lib/input_sanitizer/v2/clean_field.rb
114
+ - lib/input_sanitizer/v2/clean_payload_collection_field.rb
115
+ - lib/input_sanitizer/v2/clean_query_collection_field.rb
116
+ - lib/input_sanitizer/v2/error_collection.rb
117
+ - lib/input_sanitizer/v2/nested_sanitizer_factory.rb
118
+ - lib/input_sanitizer/v2/payload_sanitizer.rb
119
+ - lib/input_sanitizer/v2/payload_transform.rb
120
+ - lib/input_sanitizer/v2/query_sanitizer.rb
121
+ - lib/input_sanitizer/v2/types.rb
70
122
  - lib/input_sanitizer/version.rb
71
- - spec/default_converters_spec.rb
72
- - spec/extended_converters_spec.rb
123
+ - spec/extended_converters/comma_joined_integers_converter_spec.rb
124
+ - spec/extended_converters/comma_joined_strings_converter_spec.rb
125
+ - spec/extended_converters/positive_integer_converter_spec.rb
126
+ - spec/extended_converters/specific_values_converter_spec.rb
73
127
  - spec/restricted_hash_spec.rb
74
128
  - spec/sanitizer_spec.rb
75
129
  - spec/spec_helper.rb
130
+ - spec/v1/default_converters_spec.rb
131
+ - spec/v2/converters_spec.rb
132
+ - spec/v2/payload_sanitizer_spec.rb
133
+ - spec/v2/payload_transform_spec.rb
134
+ - spec/v2/query_sanitizer_spec.rb
135
+ - v2.md
76
136
  homepage: ''
77
- licenses: []
137
+ licenses:
138
+ - Apache-2.0
139
+ metadata: {}
78
140
  post_install_message:
79
141
  rdoc_options: []
80
142
  require_paths:
81
143
  - lib
82
144
  required_ruby_version: !ruby/object:Gem::Requirement
83
- none: false
84
145
  requirements:
85
- - - ! '>='
146
+ - - ">="
86
147
  - !ruby/object:Gem::Version
87
148
  version: '0'
88
149
  required_rubygems_version: !ruby/object:Gem::Requirement
89
- none: false
90
150
  requirements:
91
- - - ! '>='
151
+ - - ">="
92
152
  - !ruby/object:Gem::Version
93
153
  version: '0'
94
154
  requirements: []
95
- rubyforge_project:
96
- rubygems_version: 1.8.23
155
+ rubygems_version: 3.0.3
97
156
  signing_key:
98
- specification_version: 3
157
+ specification_version: 4
99
158
  summary: Gem to sanitize hash of incoming data
100
159
  test_files:
101
- - spec/default_converters_spec.rb
102
- - spec/extended_converters_spec.rb
160
+ - spec/extended_converters/comma_joined_integers_converter_spec.rb
161
+ - spec/extended_converters/comma_joined_strings_converter_spec.rb
162
+ - spec/extended_converters/positive_integer_converter_spec.rb
163
+ - spec/extended_converters/specific_values_converter_spec.rb
103
164
  - spec/restricted_hash_spec.rb
104
165
  - spec/sanitizer_spec.rb
105
166
  - spec/spec_helper.rb
106
- has_rdoc:
167
+ - spec/v1/default_converters_spec.rb
168
+ - spec/v2/converters_spec.rb
169
+ - spec/v2/payload_sanitizer_spec.rb
170
+ - spec/v2/payload_transform_spec.rb
171
+ - spec/v2/query_sanitizer_spec.rb
@@ -1,152 +0,0 @@
1
- require 'input_sanitizer/restricted_hash'
2
- require 'input_sanitizer/default_converters'
3
-
4
- class InputSanitizer::Sanitizer
5
- def initialize(data)
6
- @data = symbolize_keys(data)
7
- @performed = false
8
- @errors = []
9
- @cleaned = InputSanitizer::RestrictedHash.new(self.class.fields.keys)
10
- end
11
-
12
- def self.clean(data)
13
- new(data).cleaned
14
- end
15
-
16
- def [](field)
17
- cleaned[field]
18
- end
19
-
20
- def cleaned
21
- return @cleaned if @performed
22
- self.class.fields.each do |field, hash|
23
- type = hash[:type]
24
- required = hash[:options][:required]
25
- clean_field(field, type, required)
26
- end
27
- @performed = true
28
- @cleaned.freeze
29
- end
30
-
31
- def valid?
32
- cleaned
33
- @errors.empty?
34
- end
35
-
36
- def errors
37
- cleaned
38
- @errors
39
- end
40
-
41
- def self.converters
42
- {
43
- :integer => InputSanitizer::IntegerConverter.new,
44
- :string => InputSanitizer::StringConverter.new,
45
- :date => InputSanitizer::DateConverter.new,
46
- :time => InputSanitizer::TimeConverter.new,
47
- :boolean => InputSanitizer::BooleanConverter.new,
48
- :integer_or_blank => InputSanitizer::IntegerConverter.new.extend(InputSanitizer::AllowNil),
49
- :string_or_blank => InputSanitizer::StringConverter.new.extend(InputSanitizer::AllowNil),
50
- :date_or_blank => InputSanitizer::DateConverter.new.extend(InputSanitizer::AllowNil),
51
- :time_or_blank => InputSanitizer::TimeConverter.new.extend(InputSanitizer::AllowNil),
52
- :boolean_or_blank => InputSanitizer::BooleanConverter.new.extend(InputSanitizer::AllowNil),
53
- }
54
- end
55
-
56
- def self.inherited(subclass)
57
- subclass.fields = self.fields.dup
58
- end
59
-
60
- def self.string(*keys)
61
- set_keys_to_type(keys, :string)
62
- end
63
-
64
- def self.integer(*keys)
65
- set_keys_to_type(keys, :integer)
66
- end
67
-
68
- def self.boolean(*keys)
69
- set_keys_to_type(keys, :boolean)
70
- end
71
-
72
- def self.date(*keys)
73
- set_keys_to_type(keys, :date)
74
- end
75
-
76
- def self.time(*keys)
77
- set_keys_to_type(keys, :time)
78
- end
79
-
80
- def self.custom(*keys)
81
- options = keys.pop
82
- converter = options.delete(:converter)
83
- keys.push(options)
84
- raise "You did not define a converter for a custom type" if converter == nil
85
- self.set_keys_to_type(keys, converter)
86
- end
87
-
88
- protected
89
- def self.fields
90
- @fields ||= {}
91
- end
92
-
93
- def self.fields=(new_fields)
94
- @fields = new_fields
95
- end
96
-
97
- private
98
- def self.extract_options!(array)
99
- array.last.is_a?(Hash) ? array.pop : {}
100
- end
101
-
102
- def self.extract_options(array)
103
- array.last.is_a?(Hash) ? array.last : {}
104
- end
105
-
106
- def clean_field(field, type, required)
107
- if @data.has_key?(field)
108
- begin
109
- @cleaned[field] = convert(field, type)
110
- rescue InputSanitizer::ConversionError => ex
111
- add_error(field, :invalid_value, @data[field], ex.message)
112
- end
113
- elsif required
114
- add_missing(field)
115
- end
116
- end
117
-
118
- def add_error(field, error_type, value, description = nil)
119
- @errors << {
120
- :field => field,
121
- :type => error_type,
122
- :value => value,
123
- :description => description
124
- }
125
- end
126
-
127
- def add_missing(field)
128
- add_error(field, :missing, nil, nil)
129
- end
130
-
131
- def convert(field, type)
132
- converter(type).call(@data[field])
133
- end
134
-
135
- def converter(type)
136
- type.respond_to?(:call) ? type : self.class.converters[type]
137
- end
138
-
139
- def symbolize_keys(data)
140
- data.inject({}) do |memo, kv|
141
- memo[kv.first.to_sym] = kv.last
142
- memo
143
- end
144
- end
145
-
146
- def self.set_keys_to_type(keys, type)
147
- opts = extract_options!(keys)
148
- keys.each do |key|
149
- fields[key] = { :type => type, :options => opts }
150
- end
151
- end
152
- end
@@ -1,101 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe InputSanitizer::IntegerConverter do
4
- let(:converter) { InputSanitizer::IntegerConverter.new }
5
-
6
- it "casts string to integer" do
7
- converter.call("42").should == 42
8
- end
9
-
10
- it "casts integer to integer" do
11
- converter.call(42).should == 42
12
- end
13
-
14
- it "raises error if cannot cast" do
15
- lambda { converter.call("f") }.should raise_error(InputSanitizer::ConversionError)
16
- end
17
- end
18
-
19
- describe InputSanitizer::DateConverter do
20
- let(:converter) { InputSanitizer::DateConverter.new }
21
-
22
- it "casts dates in iso format" do
23
- converter.call("2012-05-15").should == Date.new(2012, 5, 15)
24
- end
25
-
26
- it "raises error if cannot cast" do
27
- lambda { converter.call("2012-02-30") }.should raise_error(InputSanitizer::ConversionError)
28
- end
29
- end
30
-
31
- describe InputSanitizer::BooleanConverter do
32
- let(:converter) { InputSanitizer::BooleanConverter.new }
33
-
34
- it "casts 'true' to true" do
35
- converter.call('true').should be_true
36
- end
37
-
38
- it "casts true to true" do
39
- converter.call(true).should be_true
40
- end
41
-
42
- it "casts '1' to true" do
43
- converter.call('1').should be_true
44
- end
45
-
46
- it "casts 'yes' to true" do
47
- converter.call('yes').should be_true
48
- end
49
-
50
- it "casts 'false' to false" do
51
- converter.call('false').should be_false
52
- end
53
-
54
- it "casts false to false" do
55
- converter.call(false).should be_false
56
- end
57
-
58
- it "casts '0' to false" do
59
- converter.call('0').should be_false
60
- end
61
-
62
- it "casts 'no' to false" do
63
- converter.call('no').should be_false
64
- end
65
-
66
- it "raises error if cannot cast" do
67
- lambda { converter.call("notboolean") }.should raise_error(InputSanitizer::ConversionError)
68
- end
69
- end
70
-
71
-
72
- describe InputSanitizer::TimeConverter do
73
- let(:converter) { InputSanitizer::TimeConverter.new }
74
-
75
- it "raises if timezone part given" do
76
- lambda { converter.call("2012-05-15 13:42:54 +01:00") }.should raise_error(InputSanitizer::ConversionError)
77
- end
78
-
79
- it "casts date time in iso format" do
80
- t = Time.utc(2012, 5, 15, 13, 42, 54)
81
- converter.call("2012-05-15 13:42:54").should == t
82
- converter.call("2012-05-15T13:42:54").should == t
83
- converter.call("20120515134254").should == t
84
-
85
- end
86
-
87
- it "does not require time part" do
88
- converter.call("2012-05-15 13:42").should == Time.utc(2012, 5, 15, 13, 42)
89
- converter.call("2012-05-15 13").should == Time.utc(2012, 5, 15, 13)
90
- converter.call("2012-05-15").should == Time.utc(2012, 5, 15)
91
-
92
- end
93
-
94
- it "raises error if can format is wrong" do
95
- lambda { converter.call("2/10/2031 13:44:22") }.should raise_error(InputSanitizer::ConversionError)
96
- end
97
-
98
- it "raises error if date is wrong" do
99
- lambda { converter.call("2012-02-32") }.should raise_error(InputSanitizer::ConversionError)
100
- end
101
- end