mutations 0.9.0 → 0.9.1
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/.travis.yml +8 -9
- data/CHANGELOG.md +6 -0
- data/Gemfile +0 -6
- data/README.md +1 -1
- data/Rakefile +0 -1
- data/lib/mutations/array_filter.rb +1 -2
- data/lib/mutations/command.rb +1 -1
- data/lib/mutations/date_filter.rb +7 -5
- data/lib/mutations/hash_filter.rb +1 -4
- data/lib/mutations/integer_filter.rb +7 -6
- data/lib/mutations/string_filter.rb +6 -8
- data/lib/mutations/version.rb +1 -1
- data/spec/array_filter_spec.rb +3 -3
- data/spec/command_spec.rb +14 -13
- data/spec/date_filter_spec.rb +2 -6
- data/spec/default_spec.rb +2 -2
- data/spec/errors_spec.rb +14 -14
- data/spec/file_filter_spec.rb +7 -11
- data/spec/hash_filter_spec.rb +19 -19
- data/spec/mutations_spec.rb +1 -1
- data/spec/string_filter_spec.rb +29 -6
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4a28329a36aca21130a7a521f6833ad47ce35f31d0c1014c432eafbdad667b5
|
4
|
+
data.tar.gz: 5b085b2e98b416ff440b6842b556bad82b7c6d38e233828f0a84a192dcb2ee0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80ceb34a91da980b81eae6f47e26c967a03c7a11d49afa7da6646236c7a39ccee2936471abb12d66a43269231cbff889b03ca01ed0c5978fffeedf11e8b2fcfb
|
7
|
+
data.tar.gz: ad443a9ce7ed66004ddf09454315902a0a47d161c9a732a70d0f26e532d000ba86a51f83da1dbbef08dc96145a322cf26834f02f1a8b92a341b15f6f2f387fec
|
data/.travis.yml
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
language: ruby
|
2
|
-
dist: trusty
|
3
|
-
sudo: required
|
4
2
|
before_install:
|
5
|
-
- gem install bundler # the default bundler version on travis is very old and causes 1.9.3 build issues
|
3
|
+
- gem install bundler || gem install bundler -v 1.17.3 # the default bundler version on travis is very old and causes 1.9.3 build issues
|
6
4
|
rvm:
|
7
5
|
- 1.9.3
|
8
|
-
- jruby-1.7.26
|
9
6
|
- 2.0.0
|
10
7
|
- 2.1.10
|
11
|
-
- 2.2.
|
12
|
-
- 2.3.
|
13
|
-
- 2.4.
|
14
|
-
-
|
15
|
-
-
|
8
|
+
- 2.2.10
|
9
|
+
- 2.3.8
|
10
|
+
- 2.4.9
|
11
|
+
- 2.5.7
|
12
|
+
- 2.6.5
|
13
|
+
- 2.7.0
|
14
|
+
- jruby-9.2.10.0
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
0.9.1
|
2
|
+
-----------
|
3
|
+
- Treat blank strings as nil when `strip` and `empty_is_nil` options are set (#148, @saverio-kantox)
|
4
|
+
- Don't use full key in nested error messages (#149, @eugeneius)
|
5
|
+
- Don't remove unknown characters in string filter (#150, @eugeneius)
|
6
|
+
|
1
7
|
0.9.0
|
2
8
|
-----------
|
3
9
|
- Retain `_id` suffix in error keys (#129, @khalilovcmd)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Mutations
|
2
2
|
|
3
|
-
[](https://travis-ci.org/cypriss/mutations)
|
3
|
+
[](https://travis-ci.org/cypriss/mutations)
|
4
4
|
[](https://codeclimate.com/github/cypriss/mutations)
|
5
5
|
|
6
6
|
Compose your business logic into commands that sanitize and validate input. Write safe, reusable, and maintainable code for Ruby and Rails apps.
|
data/Rakefile
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
module Mutations
|
2
2
|
class ArrayFilter < InputFilter
|
3
3
|
def self.register_additional_filter(type_class, type_name)
|
4
|
-
define_method(type_name) do |
|
5
|
-
options = args[0] || {}
|
4
|
+
define_method(type_name) do |options = {}, &block|
|
6
5
|
@element_filter = type_class.new(options, &block)
|
7
6
|
end
|
8
7
|
end
|
data/lib/mutations/command.rb
CHANGED
@@ -119,7 +119,7 @@ module Mutations
|
|
119
119
|
inner = path.inject(errs) do |cur_errors,part|
|
120
120
|
cur_errors[part.to_sym] ||= ErrorHash.new
|
121
121
|
end
|
122
|
-
inner[last] = ErrorAtom.new(
|
122
|
+
inner[last] = ErrorAtom.new(last.to_sym, kind, :message => message)
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
@@ -9,10 +9,6 @@ module Mutations
|
|
9
9
|
}
|
10
10
|
|
11
11
|
def filter(data)
|
12
|
-
if options[:empty_is_nil] && data == ""
|
13
|
-
data = nil
|
14
|
-
end
|
15
|
-
|
16
12
|
# Handle nil case
|
17
13
|
if data.nil?
|
18
14
|
return [nil, nil] if options[:nils]
|
@@ -20,7 +16,13 @@ module Mutations
|
|
20
16
|
end
|
21
17
|
|
22
18
|
# Now check if it's empty:
|
23
|
-
|
19
|
+
if data == ""
|
20
|
+
if options[:empty_is_nil]
|
21
|
+
return [nil, (:nils unless options[:nils])]
|
22
|
+
else
|
23
|
+
return [data, :empty]
|
24
|
+
end
|
25
|
+
end
|
24
26
|
|
25
27
|
if data.is_a?(Date) # Date and DateTime
|
26
28
|
actual_date = data
|
@@ -1,10 +1,7 @@
|
|
1
1
|
module Mutations
|
2
2
|
class HashFilter < InputFilter
|
3
3
|
def self.register_additional_filter(type_class, type_name)
|
4
|
-
define_method(type_name) do |
|
5
|
-
name = args[0]
|
6
|
-
options = args[1] || {}
|
7
|
-
|
4
|
+
define_method(type_name) do |name, options = {}, &block|
|
8
5
|
@current_inputs[name.to_sym] = type_class.new(options, &block)
|
9
6
|
end
|
10
7
|
end
|
@@ -9,11 +9,6 @@ module Mutations
|
|
9
9
|
}
|
10
10
|
|
11
11
|
def filter(data)
|
12
|
-
|
13
|
-
if options[:empty_is_nil] && data == ""
|
14
|
-
data = nil
|
15
|
-
end
|
16
|
-
|
17
12
|
# Handle nil case
|
18
13
|
if data.nil?
|
19
14
|
return [nil, nil] if options[:nils]
|
@@ -21,7 +16,13 @@ module Mutations
|
|
21
16
|
end
|
22
17
|
|
23
18
|
# Now check if it's empty:
|
24
|
-
|
19
|
+
if data == ""
|
20
|
+
if options[:empty_is_nil]
|
21
|
+
return [nil, (:nils unless options[:nils])]
|
22
|
+
else
|
23
|
+
return [data, :empty]
|
24
|
+
end
|
25
|
+
end
|
25
26
|
|
26
27
|
# Ensure it's the correct data type (Integer)
|
27
28
|
if !data.is_a?(Integer)
|
@@ -11,14 +11,10 @@ module Mutations
|
|
11
11
|
:matches => nil, # Can be a regexp
|
12
12
|
:in => nil, # Can be an array like %w(red blue green)
|
13
13
|
:discard_empty => false, # If the param is optional, discard_empty: true drops empty fields.
|
14
|
-
:allow_control_characters => false # false removes
|
14
|
+
:allow_control_characters => false # false removes control characters from the string
|
15
15
|
}
|
16
16
|
|
17
17
|
def filter(data)
|
18
|
-
if options[:empty_is_nil] && data == ""
|
19
|
-
data = nil
|
20
|
-
end
|
21
|
-
|
22
18
|
# Handle nil case
|
23
19
|
if data.nil?
|
24
20
|
return [nil, nil] if options[:nils]
|
@@ -31,15 +27,17 @@ module Mutations
|
|
31
27
|
# Now ensure it's a string:
|
32
28
|
return [data, :string] unless data.is_a?(String)
|
33
29
|
|
34
|
-
# At this point, data is a string. Now remove
|
35
|
-
data = data.gsub(/[
|
30
|
+
# At this point, data is a string. Now remove control characters from the string:
|
31
|
+
data = data.gsub(/((?=[[:cntrl:]])[^\t\r\n])+/, ' ') unless options[:allow_control_characters]
|
36
32
|
|
37
33
|
# Transform it using strip:
|
38
34
|
data = data.strip if options[:strip]
|
39
35
|
|
40
36
|
# Now check if it's blank:
|
41
37
|
if data == ""
|
42
|
-
if options[:
|
38
|
+
if options[:empty_is_nil]
|
39
|
+
return [nil, (:nils unless options[:nils])]
|
40
|
+
elsif options[:empty]
|
43
41
|
return [data, nil]
|
44
42
|
else
|
45
43
|
return [data, :empty]
|
data/lib/mutations/version.rb
CHANGED
data/spec/array_filter_spec.rb
CHANGED
@@ -155,7 +155,7 @@ describe "Mutations::ArrayFilter" do
|
|
155
155
|
|
156
156
|
assert_equal nil, errors[0]
|
157
157
|
assert_equal nil, errors[1]
|
158
|
-
assert_equal
|
158
|
+
assert_equal({"bar"=>:required}, errors[2].symbolic)
|
159
159
|
end
|
160
160
|
|
161
161
|
it "lets you pass arrays of arrays" do
|
@@ -224,7 +224,7 @@ describe "Mutations::ArrayFilter" do
|
|
224
224
|
was = Mutations.cache_constants?
|
225
225
|
Mutations.cache_constants = true
|
226
226
|
|
227
|
-
f = Mutations::ArrayFilter.new(:simple_models, class
|
227
|
+
f = Mutations::ArrayFilter.new(:simple_models, :class => "SimpleModel")
|
228
228
|
|
229
229
|
m = SimpleModel.new
|
230
230
|
filtered, errors = f.filter([m])
|
@@ -246,7 +246,7 @@ describe "Mutations::ArrayFilter" do
|
|
246
246
|
was = Mutations.cache_constants?
|
247
247
|
Mutations.cache_constants = false
|
248
248
|
|
249
|
-
f = Mutations::ArrayFilter.new(:simple_models, class
|
249
|
+
f = Mutations::ArrayFilter.new(:simple_models, :class => "SimpleModel")
|
250
250
|
|
251
251
|
m = SimpleModel.new
|
252
252
|
filtered, errors = f.filter([m])
|
data/spec/command_spec.rb
CHANGED
@@ -8,7 +8,7 @@ describe "Command" do
|
|
8
8
|
outcome = SimpleCommand.run(:name => "John", :email => "john@gmail.com", :amount => 5)
|
9
9
|
|
10
10
|
assert outcome.success?
|
11
|
-
assert_equal
|
11
|
+
assert_equal({:name => "John", :email => "john@gmail.com", :amount => 5}.stringify_keys, outcome.result)
|
12
12
|
assert_equal nil, outcome.errors
|
13
13
|
end
|
14
14
|
|
@@ -16,7 +16,7 @@ describe "Command" do
|
|
16
16
|
outcome = SimpleCommand.run(:name => "John", :email => "john@gmail.com", :amount => 5, :buggers => true)
|
17
17
|
|
18
18
|
assert outcome.success?
|
19
|
-
assert_equal
|
19
|
+
assert_equal({:name => "John", :email => "john@gmail.com", :amount => 5}.stringify_keys, outcome.result)
|
20
20
|
assert_equal nil, outcome.errors
|
21
21
|
end
|
22
22
|
|
@@ -29,7 +29,7 @@ describe "Command" do
|
|
29
29
|
|
30
30
|
it "shouldn't throw an exception with run!" do
|
31
31
|
result = SimpleCommand.run!(:name => "John", :email => "john@gmail.com", :amount => 5)
|
32
|
-
assert_equal
|
32
|
+
assert_equal({:name => "John", :email => "john@gmail.com", :amount => 5}.stringify_keys, result)
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should throw an exception with run!" do
|
@@ -77,14 +77,14 @@ describe "Command" do
|
|
77
77
|
outcome = SimpleCommand.run({:name => "John", :email => "john@gmail.com"}, {:email => "bob@jones.com", :amount => 5})
|
78
78
|
|
79
79
|
assert outcome.success?
|
80
|
-
assert_equal
|
80
|
+
assert_equal({:name => "John", :email => "bob@jones.com", :amount => 5}.stringify_keys, outcome.result)
|
81
81
|
end
|
82
82
|
|
83
83
|
it "should merge hashes indifferently" do
|
84
84
|
outcome = SimpleCommand.run({:name => "John", :email => "john@gmail.com"}, {"email" => "bob@jones.com", "amount" => 5})
|
85
85
|
|
86
86
|
assert outcome.success?
|
87
|
-
assert_equal
|
87
|
+
assert_equal({:name => "John", :email => "bob@jones.com", :amount => 5}.stringify_keys, outcome.result)
|
88
88
|
end
|
89
89
|
|
90
90
|
it "shouldn't accept objects that are not hashes or directly mappable to hashes" do
|
@@ -104,14 +104,14 @@ describe "Command" do
|
|
104
104
|
it 'should accept objects that are conceptually hashes' do
|
105
105
|
class CustomPersonHash
|
106
106
|
def to_hash
|
107
|
-
{ name
|
107
|
+
{ :name => 'John', :email => 'john@example.com' }
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
111
111
|
outcome = SimpleCommand.run(CustomPersonHash.new)
|
112
112
|
|
113
113
|
assert outcome.success?
|
114
|
-
assert_equal
|
114
|
+
assert_equal({ :name => "John", :email => "john@example.com" }.stringify_keys, outcome.result)
|
115
115
|
end
|
116
116
|
|
117
117
|
it "should accept nothing at all" do
|
@@ -120,7 +120,7 @@ describe "Command" do
|
|
120
120
|
|
121
121
|
it "should return the filtered inputs in the outcome" do
|
122
122
|
outcome = SimpleCommand.run(:name => " John ", :email => "john@gmail.com", :amount => "5")
|
123
|
-
assert_equal
|
123
|
+
assert_equal({:name => "John", :email => "john@gmail.com", :amount => 5}.stringify_keys, outcome.inputs)
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
@@ -137,7 +137,7 @@ describe "Command" do
|
|
137
137
|
|
138
138
|
it "should define getter methods on params" do
|
139
139
|
mutation = EigenCommand.run(:name => "John", :email => "john@gmail.com")
|
140
|
-
assert_equal
|
140
|
+
assert_equal({:name => "John", :email => "john@gmail.com"}, mutation.result)
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
@@ -155,7 +155,7 @@ describe "Command" do
|
|
155
155
|
|
156
156
|
it "should define setter methods on params" do
|
157
157
|
mutation = MutatatedCommand.run(:name => "John", :email => "john@gmail.com")
|
158
|
-
assert_equal
|
158
|
+
assert_equal({:name => "bob", :email => "bob@jones.com"}, mutation.result)
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
@@ -183,8 +183,8 @@ describe "Command" do
|
|
183
183
|
|
184
184
|
describe "CustomErrorKeyCommand" do
|
185
185
|
class CustomErrorKeyCommand < Mutations::Command
|
186
|
-
required { string :name, error_key
|
187
|
-
optional { string :email, min_length
|
186
|
+
required { string :name, :error_key => :other_name }
|
187
|
+
optional { string :email, :min_length => 4, :error_key => :other_email }
|
188
188
|
end
|
189
189
|
|
190
190
|
it "should return the optional error key in the error message if required" do
|
@@ -196,7 +196,7 @@ describe "Command" do
|
|
196
196
|
end
|
197
197
|
|
198
198
|
it "should return the optional error key in the error message if optional" do
|
199
|
-
outcome = CustomErrorKeyCommand.run(email
|
199
|
+
outcome = CustomErrorKeyCommand.run(:email => "foo")
|
200
200
|
|
201
201
|
assert !outcome.success?
|
202
202
|
assert_equal :min_length, outcome.errors.symbolic[:email]
|
@@ -223,6 +223,7 @@ describe "Command" do
|
|
223
223
|
assert !outcome.success?
|
224
224
|
assert_nil outcome.result
|
225
225
|
assert_equal :is_a_bob, outcome.errors[:people].symbolic[:bob]
|
226
|
+
assert_equal "Bob is invalid", outcome.errors[:people].message[:bob]
|
226
227
|
end
|
227
228
|
end
|
228
229
|
|
data/spec/date_filter_spec.rb
CHANGED
@@ -21,12 +21,8 @@ describe "Mutations::DateFilter" do
|
|
21
21
|
time = Time.now
|
22
22
|
f = Mutations::DateFilter.new
|
23
23
|
filtered, errors = f.filter(time)
|
24
|
-
|
25
|
-
|
26
|
-
assert_equal nil, errors
|
27
|
-
else
|
28
|
-
assert_equal :date, errors
|
29
|
-
end
|
24
|
+
assert_equal time.to_date, filtered
|
25
|
+
assert_equal nil, errors
|
30
26
|
end
|
31
27
|
|
32
28
|
it "checks if the given date is after a certain date" do
|
data/spec/default_spec.rb
CHANGED
@@ -16,13 +16,13 @@ describe 'Mutations - defaults' do
|
|
16
16
|
it "should have a default if no value is passed" do
|
17
17
|
outcome = DefaultCommand.run
|
18
18
|
assert_equal true, outcome.success?
|
19
|
-
assert_equal
|
19
|
+
assert_equal({"name" => "Bob Jones"}, outcome.result)
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should have the passed value if a value is passed" do
|
23
23
|
outcome = DefaultCommand.run(:name => "Fred")
|
24
24
|
assert_equal true, outcome.success?
|
25
|
-
assert_equal
|
25
|
+
assert_equal({"name" => "Fred"}, outcome.result)
|
26
26
|
end
|
27
27
|
|
28
28
|
it "should be an error if nil is passed on a required field with a default" do
|
data/spec/errors_spec.rb
CHANGED
@@ -26,33 +26,33 @@ describe "Mutations - errors" do
|
|
26
26
|
o = GivesErrors.run(:hash1 => 1, :arr1 => "bob")
|
27
27
|
|
28
28
|
assert !o.success?
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
assert_kind_of Mutations::ErrorHash, o.errors
|
30
|
+
assert_kind_of Mutations::ErrorAtom, o.errors[:str1]
|
31
|
+
assert_kind_of Mutations::ErrorAtom, o.errors[:str2]
|
32
32
|
assert_nil o.errors[:int1]
|
33
|
-
|
34
|
-
|
33
|
+
assert_kind_of Mutations::ErrorAtom, o.errors[:hash1]
|
34
|
+
assert_kind_of Mutations::ErrorAtom, o.errors[:arr1]
|
35
35
|
end
|
36
36
|
|
37
37
|
it "returns an ErrorHash for nested hashes" do
|
38
38
|
o = GivesErrors.run(:hash1 => {:bool1 => "poop"})
|
39
39
|
|
40
40
|
assert !o.success?
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
assert_kind_of Mutations::ErrorHash, o.errors
|
42
|
+
assert_kind_of Mutations::ErrorHash, o.errors[:hash1]
|
43
|
+
assert_kind_of Mutations::ErrorAtom, o.errors[:hash1][:bool1]
|
44
|
+
assert_kind_of Mutations::ErrorAtom, o.errors[:hash1][:bool2]
|
45
45
|
end
|
46
46
|
|
47
47
|
it "returns an ErrorArray for errors in arrays" do
|
48
48
|
o = GivesErrors.run(:str1 => "a", :str2 => "opt1", :arr1 => ["bob", 1, "sally"])
|
49
49
|
|
50
50
|
assert !o.success?
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
assert_kind_of Mutations::ErrorHash, o.errors
|
52
|
+
assert_kind_of Mutations::ErrorArray, o.errors[:arr1]
|
53
|
+
assert_kind_of Mutations::ErrorAtom, o.errors[:arr1][0]
|
54
54
|
assert_nil o.errors[:arr1][1]
|
55
|
-
|
55
|
+
assert_kind_of Mutations::ErrorAtom, o.errors[:arr1][2]
|
56
56
|
end
|
57
57
|
|
58
58
|
describe "error messages" do
|
@@ -97,7 +97,7 @@ describe "Mutations - errors" do
|
|
97
97
|
expected = ["Str1 can't be blank", "Str2 isn't an option", "Int1 isn't an integer", "Bool1 isn't a boolean", "Bool2 is required", "Arr1[0] isn't an integer", "Arr1[2] isn't an integer"]
|
98
98
|
|
99
99
|
assert_equal expected.size, @outcome.errors.message_list.size
|
100
|
-
expected.each { |e|
|
100
|
+
expected.each { |e| assert_includes @outcome.errors.message_list, e }
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
data/spec/file_filter_spec.rb
CHANGED
@@ -8,16 +8,12 @@ describe "Mutations::FileFilter" do
|
|
8
8
|
attr_accessor :content_type, :original_filename
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
filtered, errors = f.filter(file)
|
18
|
-
assert_equal file, filtered
|
19
|
-
assert_equal nil, errors
|
20
|
-
end
|
11
|
+
it "allows files - file class" do
|
12
|
+
file = File.new("README.md")
|
13
|
+
f = Mutations::FileFilter.new
|
14
|
+
filtered, errors = f.filter(file)
|
15
|
+
assert_equal file, filtered
|
16
|
+
assert_equal nil, errors
|
21
17
|
end
|
22
18
|
|
23
19
|
it "allows files - stringio class" do
|
@@ -32,7 +28,7 @@ describe "Mutations::FileFilter" do
|
|
32
28
|
file = Tempfile.new("bob")
|
33
29
|
f = Mutations::FileFilter.new
|
34
30
|
filtered, errors = f.filter(file)
|
35
|
-
|
31
|
+
assert_equal file, filtered
|
36
32
|
assert_equal nil, errors
|
37
33
|
end
|
38
34
|
|
data/spec/hash_filter_spec.rb
CHANGED
@@ -8,7 +8,7 @@ describe "Mutations::HashFilter" do
|
|
8
8
|
string :foo
|
9
9
|
end
|
10
10
|
filtered, errors = hf.filter(:foo => "bar")
|
11
|
-
assert_equal
|
11
|
+
assert_equal({"foo" => "bar"}, filtered)
|
12
12
|
assert_equal nil, errors
|
13
13
|
end
|
14
14
|
|
@@ -37,7 +37,7 @@ describe "Mutations::HashFilter" do
|
|
37
37
|
string :*
|
38
38
|
end
|
39
39
|
filtered, errors = hf.filter(:foo => "bar", :baz => "ban")
|
40
|
-
assert_equal
|
40
|
+
assert_equal({"foo" => "bar", "baz" => "ban"}, filtered)
|
41
41
|
assert_equal nil, errors
|
42
42
|
end
|
43
43
|
|
@@ -46,7 +46,7 @@ describe "Mutations::HashFilter" do
|
|
46
46
|
float :foo
|
47
47
|
end
|
48
48
|
filtered, errors = hf.filter(:foo => 3.14)
|
49
|
-
assert_equal
|
49
|
+
assert_equal({"foo" => 3.14}, filtered)
|
50
50
|
assert_equal nil, errors
|
51
51
|
end
|
52
52
|
|
@@ -55,7 +55,7 @@ describe "Mutations::HashFilter" do
|
|
55
55
|
duck :foo, :methods => [:length]
|
56
56
|
end
|
57
57
|
filtered, errors = hf.filter(:foo => "123")
|
58
|
-
assert_equal
|
58
|
+
assert_equal({"foo" => "123"}, filtered)
|
59
59
|
assert_equal nil, errors
|
60
60
|
end
|
61
61
|
|
@@ -74,7 +74,7 @@ describe "Mutations::HashFilter" do
|
|
74
74
|
file :foo
|
75
75
|
end
|
76
76
|
filtered, errors = hf.filter(:foo => sio)
|
77
|
-
assert_equal
|
77
|
+
assert_equal({"foo" => sio}, filtered)
|
78
78
|
assert_equal nil, errors
|
79
79
|
end
|
80
80
|
|
@@ -83,7 +83,7 @@ describe "Mutations::HashFilter" do
|
|
83
83
|
string :*
|
84
84
|
end
|
85
85
|
_filtered, errors = hf.filter(:foo => [])
|
86
|
-
assert_equal
|
86
|
+
assert_equal({"foo" => :string}, errors.symbolic)
|
87
87
|
end
|
88
88
|
|
89
89
|
it "allows a mix of specific keys and then wildcards" do
|
@@ -92,7 +92,7 @@ describe "Mutations::HashFilter" do
|
|
92
92
|
integer :*
|
93
93
|
end
|
94
94
|
filtered, errors = hf.filter(:foo => "bar", :baz => "4")
|
95
|
-
assert_equal
|
95
|
+
assert_equal({"foo" => "bar", "baz" => 4}, filtered)
|
96
96
|
assert_equal nil, errors
|
97
97
|
end
|
98
98
|
|
@@ -102,7 +102,7 @@ describe "Mutations::HashFilter" do
|
|
102
102
|
integer :*
|
103
103
|
end
|
104
104
|
_filtered, errors = hf.filter(:foo => "bar", :baz => "poopin")
|
105
|
-
assert_equal
|
105
|
+
assert_equal({"baz" => :integer}, errors.symbolic)
|
106
106
|
end
|
107
107
|
|
108
108
|
describe "optional params and nils" do
|
@@ -117,7 +117,7 @@ describe "Mutations::HashFilter" do
|
|
117
117
|
end
|
118
118
|
|
119
119
|
filtered, errors = hf.filter(:foo => "bar")
|
120
|
-
assert_equal
|
120
|
+
assert_equal({"foo" => "bar"}, filtered)
|
121
121
|
assert_equal nil, errors
|
122
122
|
end
|
123
123
|
|
@@ -132,7 +132,7 @@ describe "Mutations::HashFilter" do
|
|
132
132
|
end
|
133
133
|
|
134
134
|
filtered, errors = hf.filter(:foo => "bar", :bar => nil)
|
135
|
-
assert_equal
|
135
|
+
assert_equal({"foo" => "bar"}, filtered)
|
136
136
|
assert_equal nil, errors
|
137
137
|
end
|
138
138
|
|
@@ -147,7 +147,7 @@ describe "Mutations::HashFilter" do
|
|
147
147
|
end
|
148
148
|
|
149
149
|
filtered, errors = hf.filter(:foo => "bar", :bar => nil)
|
150
|
-
assert_equal
|
150
|
+
assert_equal({"foo" => "bar", "bar" => nil}, filtered)
|
151
151
|
assert_equal nil, errors
|
152
152
|
end
|
153
153
|
end
|
@@ -164,7 +164,7 @@ describe "Mutations::HashFilter" do
|
|
164
164
|
end
|
165
165
|
|
166
166
|
filtered, errors = hf.filter(:foo => "bar", :bar => "")
|
167
|
-
assert_equal
|
167
|
+
assert_equal({"foo" => "bar"}, filtered)
|
168
168
|
assert_equal nil, errors
|
169
169
|
end
|
170
170
|
|
@@ -179,7 +179,7 @@ describe "Mutations::HashFilter" do
|
|
179
179
|
end
|
180
180
|
|
181
181
|
filtered, errors = hf.filter(:foo => "bar", :bar => " ")
|
182
|
-
assert_equal
|
182
|
+
assert_equal({"foo" => "bar"}, filtered)
|
183
183
|
assert_equal nil, errors
|
184
184
|
end
|
185
185
|
|
@@ -194,7 +194,7 @@ describe "Mutations::HashFilter" do
|
|
194
194
|
end
|
195
195
|
|
196
196
|
filtered, errors = hf.filter(:foo => "bar", :bar => " ")
|
197
|
-
assert_equal
|
197
|
+
assert_equal({"foo" => "bar", "bar" => " "}, filtered)
|
198
198
|
assert_equal nil, errors
|
199
199
|
end
|
200
200
|
|
@@ -209,7 +209,7 @@ describe "Mutations::HashFilter" do
|
|
209
209
|
end
|
210
210
|
|
211
211
|
_filtered, errors = hf.filter(:foo => "bar", :bar => "")
|
212
|
-
assert_equal
|
212
|
+
assert_equal({"bar" => :empty}, errors.symbolic)
|
213
213
|
end
|
214
214
|
|
215
215
|
it "bar is optional -- discards empty -- now with wildcards" do
|
@@ -223,7 +223,7 @@ describe "Mutations::HashFilter" do
|
|
223
223
|
end
|
224
224
|
|
225
225
|
filtered, errors = hf.filter(:foo => "bar", :bar => "", :baz => "\t")
|
226
|
-
assert_equal
|
226
|
+
assert_equal({"foo" => "bar"}, filtered)
|
227
227
|
assert_equal nil, errors
|
228
228
|
end
|
229
229
|
end
|
@@ -240,7 +240,7 @@ describe "Mutations::HashFilter" do
|
|
240
240
|
end
|
241
241
|
|
242
242
|
filtered, errors = hf.filter(:foo => "bar", :bar => "baz")
|
243
|
-
assert_equal
|
243
|
+
assert_equal({"foo" => "bar"}, filtered)
|
244
244
|
assert_equal nil, errors
|
245
245
|
end
|
246
246
|
|
@@ -255,7 +255,7 @@ describe "Mutations::HashFilter" do
|
|
255
255
|
end
|
256
256
|
|
257
257
|
filtered, errors = hf.filter(:foo => "bar", :bar => "baz", :wat => 1)
|
258
|
-
assert_equal
|
258
|
+
assert_equal({"foo" => "bar", "wat" => 1}, filtered)
|
259
259
|
assert_equal nil, errors
|
260
260
|
end
|
261
261
|
|
@@ -268,7 +268,7 @@ describe "Mutations::HashFilter" do
|
|
268
268
|
end
|
269
269
|
|
270
270
|
_filtered, errors = hf.filter(:foo => "bar")
|
271
|
-
assert_equal
|
271
|
+
assert_equal({"foo" => :integer}, errors.symbolic)
|
272
272
|
end
|
273
273
|
end
|
274
274
|
|
data/spec/mutations_spec.rb
CHANGED
data/spec/string_filter_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe "Mutations::StringFilter" do
|
@@ -16,7 +18,7 @@ describe "Mutations::StringFilter" do
|
|
16
18
|
assert_equal nil, errors
|
17
19
|
end
|
18
20
|
|
19
|
-
it "allows
|
21
|
+
it "allows numbers" do
|
20
22
|
sf = Mutations::StringFilter.new
|
21
23
|
filtered, errors = sf.filter(1)
|
22
24
|
assert_equal "1", filtered
|
@@ -93,7 +95,21 @@ describe "Mutations::StringFilter" do
|
|
93
95
|
assert_equal :empty, errors
|
94
96
|
end
|
95
97
|
|
96
|
-
it "considers strings that
|
98
|
+
it "considers stripped strings that are blank to be nil if empty_is_nil option is used" do
|
99
|
+
sf = Mutations::StringFilter.new(:strip => true, :empty_is_nil => true, :nils => true)
|
100
|
+
filtered, errors = sf.filter(" ")
|
101
|
+
assert_equal nil, filtered
|
102
|
+
assert_equal nil, errors
|
103
|
+
end
|
104
|
+
|
105
|
+
it "considers stripped strings that are blank to be invalid if empty_is_nil option is used" do
|
106
|
+
sf = Mutations::StringFilter.new(:strip => true, :empty_is_nil => true)
|
107
|
+
filtered, errors = sf.filter(" ")
|
108
|
+
assert_equal nil, filtered
|
109
|
+
assert_equal :nils, errors
|
110
|
+
end
|
111
|
+
|
112
|
+
it "considers strings that contain only control characters to be invalid" do
|
97
113
|
sf = Mutations::StringFilter.new(:empty => false)
|
98
114
|
filtered, errors = sf.filter("\u0000\u0000")
|
99
115
|
assert_equal "", filtered
|
@@ -172,7 +188,7 @@ describe "Mutations::StringFilter" do
|
|
172
188
|
|
173
189
|
it "converts bigdecimals to strings" do
|
174
190
|
sf = Mutations::StringFilter.new(:strict => false)
|
175
|
-
filtered, errors = sf.filter(BigDecimal
|
191
|
+
filtered, errors = sf.filter(BigDecimal("0.0001"))
|
176
192
|
assert_equal("0.1E-3", filtered.upcase)
|
177
193
|
assert_equal nil, errors
|
178
194
|
end
|
@@ -207,7 +223,7 @@ describe "Mutations::StringFilter" do
|
|
207
223
|
|
208
224
|
it "disallows bigdecimals" do
|
209
225
|
sf = Mutations::StringFilter.new(:strict => true)
|
210
|
-
big_decimal = BigDecimal
|
226
|
+
big_decimal = BigDecimal("0.0001")
|
211
227
|
filtered, errors = sf.filter(big_decimal)
|
212
228
|
assert_equal big_decimal, filtered
|
213
229
|
assert_equal :string, errors
|
@@ -227,14 +243,14 @@ describe "Mutations::StringFilter" do
|
|
227
243
|
assert_equal :string, errors
|
228
244
|
end
|
229
245
|
|
230
|
-
it "removes
|
246
|
+
it "removes control characters" do
|
231
247
|
sf = Mutations::StringFilter.new(:allow_control_characters => false)
|
232
248
|
filtered, errors = sf.filter("Hello\u0000\u0000World!")
|
233
249
|
assert_equal "Hello World!", filtered
|
234
250
|
assert_equal nil, errors
|
235
251
|
end
|
236
252
|
|
237
|
-
it "doesn't remove
|
253
|
+
it "doesn't remove control characters" do
|
238
254
|
sf = Mutations::StringFilter.new(:allow_control_characters => true)
|
239
255
|
filtered, errors = sf.filter("Hello\u0000\u0000World!")
|
240
256
|
assert_equal "Hello\u0000\u0000World!", filtered
|
@@ -248,4 +264,11 @@ describe "Mutations::StringFilter" do
|
|
248
264
|
assert_equal nil, errors
|
249
265
|
end
|
250
266
|
|
267
|
+
it "doesn't remove emoji" do
|
268
|
+
sf = Mutations::StringFilter.new(:allow_control_characters => false)
|
269
|
+
filtered, errors = sf.filter("😂🙂🙃🤣🤩🥰🥱")
|
270
|
+
assert_equal "😂🙂🙃🤣🤩🥰🥱", filtered
|
271
|
+
assert_equal nil, errors
|
272
|
+
end
|
273
|
+
|
251
274
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mutations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Novak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -127,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
127
|
- !ruby/object:Gem::Version
|
128
128
|
version: '0'
|
129
129
|
requirements: []
|
130
|
-
rubygems_version: 3.
|
130
|
+
rubygems_version: 3.1.2
|
131
131
|
signing_key:
|
132
132
|
specification_version: 4
|
133
133
|
summary: Compose your business logic into commands that sanitize and validate input.
|