mutations 0.5.12 → 0.6.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 (42) hide show
  1. data/{.travis → .travis.yml} +3 -0
  2. data/CHANGELOG.md +10 -2
  3. data/Gemfile +5 -2
  4. data/README.md +1 -0
  5. data/TODO +1 -3
  6. data/lib/mutations.rb +14 -1
  7. data/lib/mutations/additional_filter.rb +13 -0
  8. data/lib/mutations/array_filter.rb +12 -30
  9. data/lib/mutations/boolean_filter.rb +3 -3
  10. data/lib/mutations/command.rb +5 -4
  11. data/lib/mutations/date_filter.rb +52 -0
  12. data/lib/mutations/duck_filter.rb +4 -4
  13. data/lib/mutations/errors.rb +24 -20
  14. data/lib/mutations/exception.rb +1 -1
  15. data/lib/mutations/file_filter.rb +7 -7
  16. data/lib/mutations/float_filter.rb +5 -5
  17. data/lib/mutations/hash_filter.rb +12 -29
  18. data/lib/mutations/integer_filter.rb +5 -5
  19. data/lib/mutations/model_filter.rb +13 -8
  20. data/lib/mutations/outcome.rb +1 -1
  21. data/lib/mutations/string_filter.rb +10 -10
  22. data/lib/mutations/version.rb +2 -2
  23. data/mutations.gemspec +0 -2
  24. data/spec/additional_filter_spec.rb +76 -0
  25. data/spec/array_filter_spec.rb +25 -17
  26. data/spec/boolean_filter_spec.rb +5 -5
  27. data/spec/command_spec.rb +30 -30
  28. data/spec/date_filter_spec.rb +146 -0
  29. data/spec/default_spec.rb +10 -10
  30. data/spec/duck_filter_spec.rb +6 -6
  31. data/spec/errors_spec.rb +8 -9
  32. data/spec/file_filter_spec.rb +26 -22
  33. data/spec/float_filter_spec.rb +8 -8
  34. data/spec/hash_filter_spec.rb +31 -23
  35. data/spec/inheritance_spec.rb +9 -9
  36. data/spec/integer_filter_spec.rb +9 -9
  37. data/spec/model_filter_spec.rb +26 -6
  38. data/spec/mutations_spec.rb +1 -1
  39. data/spec/simple_command.rb +2 -2
  40. data/spec/spec_helper.rb +1 -1
  41. data/spec/string_filter_spec.rb +17 -17
  42. metadata +8 -4
@@ -1,4 +1,4 @@
1
- require_relative 'spec_helper'
1
+ require 'spec_helper'
2
2
  require 'stringio'
3
3
 
4
4
  describe "Mutations::HashFilter" do
@@ -7,7 +7,7 @@ describe "Mutations::HashFilter" do
7
7
  hf = Mutations::HashFilter.new do
8
8
  string :foo
9
9
  end
10
- filtered, errors = hf.filter(foo: "bar")
10
+ filtered, errors = hf.filter(:foo => "bar")
11
11
  assert_equal ({"foo" => "bar"}), filtered
12
12
  assert_equal nil, errors
13
13
  end
@@ -24,7 +24,7 @@ describe "Mutations::HashFilter" do
24
24
  hf = Mutations::HashFilter.new do
25
25
  string :*
26
26
  end
27
- filtered, errors = hf.filter(foo: "bar", baz: "ban")
27
+ filtered, errors = hf.filter(:foo => "bar", :baz => "ban")
28
28
  assert_equal ({"foo" => "bar", "baz" => "ban"}), filtered
29
29
  assert_equal nil, errors
30
30
  end
@@ -33,26 +33,35 @@ describe "Mutations::HashFilter" do
33
33
  hf = Mutations::HashFilter.new do
34
34
  float :foo
35
35
  end
36
- filtered, errors = hf.filter(foo: 3.14)
36
+ filtered, errors = hf.filter(:foo => 3.14)
37
37
  assert_equal ({"foo" => 3.14}), filtered
38
38
  assert_equal nil, errors
39
39
  end
40
-
40
+
41
41
  it "allows ducks in hashes" do
42
42
  hf = Mutations::HashFilter.new do
43
- duck :foo, methods: [:length]
43
+ duck :foo, :methods => [:length]
44
44
  end
45
- filtered, errors = hf.filter(foo: "123")
45
+ filtered, errors = hf.filter(:foo => "123")
46
46
  assert_equal ({"foo" => "123"}), filtered
47
47
  assert_equal nil, errors
48
48
  end
49
-
49
+
50
+ it "allows dates in hashes" do
51
+ hf = Mutations::HashFilter.new do
52
+ date :foo, :format => "%d-%m-%Y"
53
+ end
54
+ filtered, errors = hf.filter(:foo => "1-1-2000")
55
+ assert_equal Date.new(2000, 1, 1), filtered[:foo]
56
+ assert_equal nil, errors
57
+ end
58
+
50
59
  it "allows files in hashes" do
51
60
  sio = StringIO.new("bob")
52
61
  hf = Mutations::HashFilter.new do
53
62
  file :foo
54
63
  end
55
- filtered, errors = hf.filter(foo: sio)
64
+ filtered, errors = hf.filter(:foo => sio)
56
65
  assert_equal ({"foo" => sio}), filtered
57
66
  assert_equal nil, errors
58
67
  end
@@ -61,7 +70,7 @@ describe "Mutations::HashFilter" do
61
70
  hf = Mutations::HashFilter.new do
62
71
  string :*
63
72
  end
64
- filtered, errors = hf.filter(foo: [])
73
+ filtered, errors = hf.filter(:foo => [])
65
74
  assert_equal ({"foo" => :string}), errors.symbolic
66
75
  end
67
76
 
@@ -70,7 +79,7 @@ describe "Mutations::HashFilter" do
70
79
  string :foo
71
80
  integer :*
72
81
  end
73
- filtered, errors = hf.filter(foo: "bar", baz: "4")
82
+ filtered, errors = hf.filter(:foo => "bar", :baz => "4")
74
83
  assert_equal ({"foo" => "bar", "baz" => 4}), filtered
75
84
  assert_equal nil, errors
76
85
  end
@@ -80,7 +89,7 @@ describe "Mutations::HashFilter" do
80
89
  string :foo
81
90
  integer :*
82
91
  end
83
- filtered, errors = hf.filter(foo: "bar", baz: "poopin")
92
+ filtered, errors = hf.filter(:foo => "bar", :baz => "poopin")
84
93
  assert_equal ({"baz" => :integer}), errors.symbolic
85
94
  end
86
95
 
@@ -95,7 +104,7 @@ describe "Mutations::HashFilter" do
95
104
  end
96
105
  end
97
106
 
98
- filtered, errors = hf.filter(foo: "bar")
107
+ filtered, errors = hf.filter(:foo => "bar")
99
108
  assert_equal ({"foo" => "bar"}), filtered
100
109
  assert_equal nil, errors
101
110
  end
@@ -110,7 +119,7 @@ describe "Mutations::HashFilter" do
110
119
  end
111
120
  end
112
121
 
113
- filtered, errors = hf.filter(foo: "bar", bar: nil)
122
+ filtered, errors = hf.filter(:foo => "bar", :bar => nil)
114
123
  assert_equal ({"foo" => "bar"}), filtered
115
124
  assert_equal nil, errors
116
125
  end
@@ -121,11 +130,11 @@ describe "Mutations::HashFilter" do
121
130
  string :foo
122
131
  end
123
132
  optional do
124
- string :bar, nils: true
133
+ string :bar, :nils => true
125
134
  end
126
135
  end
127
136
 
128
- filtered, errors = hf.filter(foo: "bar", bar: nil)
137
+ filtered, errors = hf.filter(:foo => "bar", :bar => nil)
129
138
  assert_equal ({"foo" => "bar", "bar" => nil}), filtered
130
139
  assert_equal nil, errors
131
140
  end
@@ -138,11 +147,11 @@ describe "Mutations::HashFilter" do
138
147
  string :foo
139
148
  end
140
149
  optional do
141
- string :bar, discard_empty: true
150
+ string :bar, :discard_empty => true
142
151
  end
143
152
  end
144
153
 
145
- filtered, errors = hf.filter(foo: "bar", bar: "")
154
+ filtered, errors = hf.filter(:foo => "bar", :bar => "")
146
155
  assert_equal ({"foo" => "bar"}), filtered
147
156
  assert_equal nil, errors
148
157
  end
@@ -153,11 +162,11 @@ describe "Mutations::HashFilter" do
153
162
  string :foo
154
163
  end
155
164
  optional do
156
- string :bar, discard_empty: false
165
+ string :bar, :discard_empty => false
157
166
  end
158
167
  end
159
168
 
160
- filtered, errors = hf.filter(foo: "bar", bar: "")
169
+ filtered, errors = hf.filter(:foo => "bar", :bar => "")
161
170
  assert_equal ({"bar" => :empty}), errors.symbolic
162
171
  end
163
172
 
@@ -167,15 +176,14 @@ describe "Mutations::HashFilter" do
167
176
  string :foo
168
177
  end
169
178
  optional do
170
- string :*, discard_empty: true
179
+ string :*, :discard_empty => true
171
180
  end
172
181
  end
173
182
 
174
- filtered, errors = hf.filter(foo: "bar", bar: "")
183
+ filtered, errors = hf.filter(:foo => "bar", :bar => "")
175
184
  assert_equal ({"foo" => "bar"}), filtered
176
185
  assert_equal nil, errors
177
186
  end
178
187
  end
179
188
 
180
-
181
189
  end
@@ -1,4 +1,4 @@
1
- require_relative 'spec_helper'
1
+ require 'spec_helper'
2
2
  require 'simple_command'
3
3
 
4
4
  describe 'Mutations - inheritance' do
@@ -15,25 +15,25 @@ describe 'Mutations - inheritance' do
15
15
  end
16
16
 
17
17
  it 'should filter with inherited command' do
18
- mutation = SimpleInherited.run(name: "bob", email: "jon@jones.com", age: 10, amount: 22)
18
+ mutation = SimpleInherited.run(:name => "bob", :email => "jon@jones.com", :age => 10, :amount => 22)
19
19
  assert mutation.success?
20
- assert_equal HashWithIndifferentAccess.new(name: "bob", email: "jon@jones.com", age: 10, amount: 22), mutation.result
20
+ assert_equal HashWithIndifferentAccess.new(:name => "bob", :email => "jon@jones.com", :age => 10, :amount => 22), mutation.result
21
21
  end
22
22
 
23
23
  it 'should filter with original command' do
24
- mutation = SimpleCommand.run(name: "bob", email: "jon@jones.com", age: 10, amount: 22)
24
+ mutation = SimpleCommand.run(:name => "bob", :email => "jon@jones.com", :age => 10, :amount => 22)
25
25
  assert mutation.success?
26
- assert_equal HashWithIndifferentAccess.new(name: "bob", email: "jon@jones.com", amount: 22), mutation.result
26
+ assert_equal HashWithIndifferentAccess.new(:name => "bob", :email => "jon@jones.com", :amount => 22), mutation.result
27
27
  end
28
28
 
29
29
  it 'shouldnt collide' do
30
- mutation = SimpleInherited.run(name: "bob", email: "jon@jones.com", age: 10, amount: 22)
30
+ mutation = SimpleInherited.run(:name => "bob", :email => "jon@jones.com", :age => 10, :amount => 22)
31
31
  assert mutation.success?
32
- assert_equal HashWithIndifferentAccess.new(name: "bob", email: "jon@jones.com", age: 10, amount: 22), mutation.result
32
+ assert_equal HashWithIndifferentAccess.new(:name => "bob", :email => "jon@jones.com", :age => 10, :amount => 22), mutation.result
33
33
 
34
- mutation = SimpleCommand.run(name: "bob", email: "jon@jones.com", age: 10, amount: 22)
34
+ mutation = SimpleCommand.run(:name => "bob", :email => "jon@jones.com", :age => 10, :amount => 22)
35
35
  assert mutation.success?
36
- assert_equal HashWithIndifferentAccess.new(name: "bob", email: "jon@jones.com", amount: 22), mutation.result
36
+ assert_equal HashWithIndifferentAccess.new(:name => "bob", :email => "jon@jones.com", :amount => 22), mutation.result
37
37
  end
38
38
 
39
39
  end
@@ -1,4 +1,4 @@
1
- require_relative 'spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe "Mutations::IntegerFilter" do
4
4
 
@@ -32,56 +32,56 @@ describe "Mutations::IntegerFilter" do
32
32
  end
33
33
 
34
34
  it "considers nil to be invalid" do
35
- f = Mutations::IntegerFilter.new(nils: false)
35
+ f = Mutations::IntegerFilter.new(:nils => false)
36
36
  filtered, errors = f.filter(nil)
37
37
  assert_equal nil, filtered
38
38
  assert_equal :nils, errors
39
39
  end
40
40
 
41
41
  it "considers nil to be valid" do
42
- f = Mutations::IntegerFilter.new(nils: true)
42
+ f = Mutations::IntegerFilter.new(:nils => true)
43
43
  filtered, errors = f.filter(nil)
44
44
  assert_equal nil, filtered
45
45
  assert_equal nil, errors
46
46
  end
47
47
 
48
48
  it "considers low numbers invalid" do
49
- f = Mutations::IntegerFilter.new(min: 10)
49
+ f = Mutations::IntegerFilter.new(:min => 10)
50
50
  filtered, errors = f.filter(3)
51
51
  assert_equal 3, filtered
52
52
  assert_equal :min, errors
53
53
  end
54
54
 
55
55
  it "considers low numbers valid" do
56
- f = Mutations::IntegerFilter.new(min: 10)
56
+ f = Mutations::IntegerFilter.new(:min => 10)
57
57
  filtered, errors = f.filter(31)
58
58
  assert_equal 31, filtered
59
59
  assert_equal nil, errors
60
60
  end
61
61
 
62
62
  it "considers high numbers invalid" do
63
- f = Mutations::IntegerFilter.new(max: 10)
63
+ f = Mutations::IntegerFilter.new(:max => 10)
64
64
  filtered, errors = f.filter(31)
65
65
  assert_equal 31, filtered
66
66
  assert_equal :max, errors
67
67
  end
68
68
 
69
69
  it "considers high numbers vaild" do
70
- f = Mutations::IntegerFilter.new(max: 10)
70
+ f = Mutations::IntegerFilter.new(:max => 10)
71
71
  filtered, errors = f.filter(3)
72
72
  assert_equal 3, filtered
73
73
  assert_equal nil, errors
74
74
  end
75
75
 
76
76
  it "considers not matching numbers to be invalid" do
77
- f = Mutations::IntegerFilter.new(in: [3, 4, 5])
77
+ f = Mutations::IntegerFilter.new(:in => [3, 4, 5])
78
78
  filtered, errors = f.filter(6)
79
79
  assert_equal 6, filtered
80
80
  assert_equal :in, errors
81
81
  end
82
82
 
83
83
  it "considers matching numbers to be valid" do
84
- f = Mutations::IntegerFilter.new(in: [3, 4, 5])
84
+ f = Mutations::IntegerFilter.new(:in => [3, 4, 5])
85
85
  filtered, errors = f.filter(3)
86
86
  assert_equal 3, filtered
87
87
  assert_nil errors
@@ -1,4 +1,4 @@
1
- require_relative 'spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe "Mutations::ModelFilter" do
4
4
 
@@ -15,7 +15,6 @@ describe "Mutations::ModelFilter" do
15
15
  end
16
16
  end
17
17
 
18
-
19
18
  it "allows models" do
20
19
  f = Mutations::ModelFilter.new(:simple_model)
21
20
  m = SimpleModel.new
@@ -35,32 +34,53 @@ describe "Mutations::ModelFilter" do
35
34
  end
36
35
 
37
36
  it "raises an exception during filtering if constantization of class fails" do
38
- f = Mutations::ModelFilter.new(:simple_model, class: "ComplexModel")
37
+ f = Mutations::ModelFilter.new(:simple_model, :class => "ComplexModel")
39
38
  assert_raises NameError do
40
39
  f.filter(nil)
41
40
  end
42
41
  end
43
42
 
44
43
  it "raises an exception during filtering if constantization of builder fails" do
45
- f = Mutations::ModelFilter.new(:simple_model, builder: "ComplexModel")
44
+ f = Mutations::ModelFilter.new(:simple_model, :builder => "ComplexModel")
46
45
  assert_raises NameError do
47
46
  f.filter(nil)
48
47
  end
49
48
  end
50
49
 
51
50
  it "considers nil to be invalid" do
52
- f = Mutations::ModelFilter.new(:simple_model, nils: false)
51
+ f = Mutations::ModelFilter.new(:simple_model, :nils => false)
53
52
  filtered, errors = f.filter(nil)
54
53
  assert_equal nil, filtered
55
54
  assert_equal :nils, errors
56
55
  end
57
56
 
58
57
  it "considers nil to be valid" do
59
- f = Mutations::ModelFilter.new(:simple_model, nils: true)
58
+ f = Mutations::ModelFilter.new(:simple_model, :nils => true)
60
59
  filtered, errors = f.filter(nil)
61
60
  assert_equal nil, filtered
62
61
  assert_equal nil, errors
63
62
  end
63
+
64
+ it "will re-constantize if cache_constants is false" do
65
+ was = Mutations.cache_constants?
66
+ Mutations.cache_constants = false
67
+ f = Mutations::ModelFilter.new(:simple_model)
68
+ m = SimpleModel.new
69
+ filtered, errors = f.filter(m)
70
+ assert_equal m, filtered
71
+ assert_equal nil, errors
72
+
73
+ Object.send(:remove_const, 'SimpleModel')
74
+
75
+ class SimpleModel; end
76
+
77
+ m = SimpleModel.new
78
+ filtered, errors = f.filter(m)
79
+ assert_equal m, filtered
80
+ assert_equal nil, errors
81
+
82
+ Mutations.cache_constants = was
83
+ end
64
84
 
65
85
  # it "allows you to override class with a constant and succeed" do
66
86
  # end
@@ -1,4 +1,4 @@
1
- require_relative 'spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe 'Mutations' do
4
4
 
@@ -1,7 +1,7 @@
1
1
  class SimpleCommand < Mutations::Command
2
2
 
3
3
  required do
4
- string :name, max_length: 10
4
+ string :name, :max_length => 10
5
5
  string :email
6
6
  end
7
7
 
@@ -12,4 +12,4 @@ class SimpleCommand < Mutations::Command
12
12
  def execute
13
13
  inputs
14
14
  end
15
- end
15
+ end
data/spec/spec_helper.rb CHANGED
@@ -5,4 +5,4 @@ require 'pp'
5
5
  $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__))
6
6
  $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
7
7
 
8
- require 'mutations'
8
+ require 'mutations'
@@ -1,4 +1,4 @@
1
- require_relative 'spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe "Mutations::StringFilter" do
4
4
 
@@ -25,112 +25,112 @@ describe "Mutations::StringFilter" do
25
25
 
26
26
  it "disallows non-string" do
27
27
  sf = Mutations::StringFilter.new
28
- [["foo"], {a: "1"}, Object.new].each do |thing|
28
+ [["foo"], {:a => "1"}, Object.new].each do |thing|
29
29
  filtered, errors = sf.filter(thing)
30
30
  assert_equal :string, errors
31
31
  end
32
32
  end
33
33
 
34
34
  it "strips" do
35
- sf = Mutations::StringFilter.new(strip: true)
35
+ sf = Mutations::StringFilter.new(:strip => true)
36
36
  filtered, errors = sf.filter(" hello ")
37
37
  assert_equal "hello", filtered
38
38
  assert_equal nil, errors
39
39
  end
40
40
 
41
41
  it "doesn't strip" do
42
- sf = Mutations::StringFilter.new(strip: false)
42
+ sf = Mutations::StringFilter.new(:strip => false)
43
43
  filtered, errors = sf.filter(" hello ")
44
44
  assert_equal " hello ", filtered
45
45
  assert_equal nil, errors
46
46
  end
47
47
 
48
48
  it "considers nil to be invalid" do
49
- sf = Mutations::StringFilter.new(nils: false)
49
+ sf = Mutations::StringFilter.new(:nils => false)
50
50
  filtered, errors = sf.filter(nil)
51
51
  assert_equal nil, filtered
52
52
  assert_equal :nils, errors
53
53
  end
54
54
 
55
55
  it "considers nil to be valid" do
56
- sf = Mutations::StringFilter.new(nils: true)
56
+ sf = Mutations::StringFilter.new(:nils => true)
57
57
  filtered, errors = sf.filter(nil)
58
58
  assert_equal nil, filtered
59
59
  assert_equal nil, errors
60
60
  end
61
61
 
62
62
  it "considers empty strings to be invalid" do
63
- sf = Mutations::StringFilter.new(empty: false)
63
+ sf = Mutations::StringFilter.new(:empty => false)
64
64
  filtered, errors = sf.filter("")
65
65
  assert_equal "", filtered
66
66
  assert_equal :empty, errors
67
67
  end
68
68
 
69
69
  it "considers empty strings to be valid" do
70
- sf = Mutations::StringFilter.new(empty: true)
70
+ sf = Mutations::StringFilter.new(:empty => true)
71
71
  filtered, errors = sf.filter("")
72
72
  assert_equal "", filtered
73
73
  assert_equal nil, errors
74
74
  end
75
75
 
76
76
  it "considers stripped strings that are empty to be invalid" do
77
- sf = Mutations::StringFilter.new(empty: false)
77
+ sf = Mutations::StringFilter.new(:empty => false)
78
78
  filtered, errors = sf.filter(" ")
79
79
  assert_equal "", filtered
80
80
  assert_equal :empty, errors
81
81
  end
82
82
 
83
83
  it "considers long strings to be invalid" do
84
- sf = Mutations::StringFilter.new(max_length: 5)
84
+ sf = Mutations::StringFilter.new(:max_length => 5)
85
85
  filtered, errors = sf.filter("123456")
86
86
  assert_equal "123456", filtered
87
87
  assert_equal :max_length, errors
88
88
  end
89
89
 
90
90
  it "considers long strings to be valid" do
91
- sf = Mutations::StringFilter.new(max_length: 5)
91
+ sf = Mutations::StringFilter.new(:max_length => 5)
92
92
  filtered, errors = sf.filter("12345")
93
93
  assert_equal "12345", filtered
94
94
  assert_equal nil, errors
95
95
  end
96
96
 
97
97
  it "considers short strings to be invalid" do
98
- sf = Mutations::StringFilter.new(min_length: 5)
98
+ sf = Mutations::StringFilter.new(:min_length => 5)
99
99
  filtered, errors = sf.filter("1234")
100
100
  assert_equal "1234", filtered
101
101
  assert_equal :min_length, errors
102
102
  end
103
103
 
104
104
  it "considers short strings to be valid" do
105
- sf = Mutations::StringFilter.new(min_length: 5)
105
+ sf = Mutations::StringFilter.new(:min_length => 5)
106
106
  filtered, errors = sf.filter("12345")
107
107
  assert_equal "12345", filtered
108
108
  assert_equal nil, errors
109
109
  end
110
110
 
111
111
  it "considers bad matches to be invalid" do
112
- sf = Mutations::StringFilter.new(matches: /aaa/)
112
+ sf = Mutations::StringFilter.new(:matches => /aaa/)
113
113
  filtered, errors = sf.filter("aab")
114
114
  assert_equal "aab", filtered
115
115
  assert_equal :matches, errors
116
116
  end
117
117
 
118
118
  it "considers good matches to be valid" do
119
- sf = Mutations::StringFilter.new(matches: /aaa/)
119
+ sf = Mutations::StringFilter.new(:matches => /aaa/)
120
120
  filtered, errors = sf.filter("baaab")
121
121
  assert_equal "baaab", filtered
122
122
  assert_equal nil, errors
123
123
  end
124
124
 
125
125
  it "considers non-inclusion to be invalid" do
126
- sf = Mutations::StringFilter.new(in: %w(red blue green))
126
+ sf = Mutations::StringFilter.new(:in => %w(red blue green))
127
127
  filtered, errors = sf.filter("orange")
128
128
  assert_equal "orange", filtered
129
129
  assert_equal :in, errors
130
130
  end
131
131
 
132
132
  it "considers inclusion to be valid" do
133
- sf = Mutations::StringFilter.new(in: %w(red blue green))
133
+ sf = Mutations::StringFilter.new(:in => %w(red blue green))
134
134
  filtered, errors = sf.filter("red")
135
135
  assert_equal "red", filtered
136
136
  assert_equal nil, errors