mutations 0.5.4 → 0.5.9

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mutations (0.5.2)
4
+ mutations (0.5.9)
5
5
  activesupport
6
6
 
7
7
  GEM
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+ - Document default behavior discarding of nils for optional params
2
+ - document string.discard_empty
data/lib/mutations.rb CHANGED
@@ -8,6 +8,7 @@ require 'mutations/errors'
8
8
  require 'mutations/input_filter'
9
9
  require 'mutations/string_filter'
10
10
  require 'mutations/integer_filter'
11
+ require 'mutations/float_filter'
11
12
  require 'mutations/boolean_filter'
12
13
  require 'mutations/model_filter'
13
14
  require 'mutations/array_filter'
@@ -20,7 +21,7 @@ module Mutations
20
21
  def error_message_creator
21
22
  @error_message_creator ||= DefaultErrorMessageCreator.new
22
23
  end
23
-
24
+
24
25
  def error_message_creator=(creator)
25
26
  @error_message_creator = creator
26
27
  end
@@ -87,7 +87,7 @@ module Mutations
87
87
  # state: ErrorAtom(:in)
88
88
  # }
89
89
  # }
90
- class ErrorHash < HashWithIndifferentAccess
90
+ class ErrorHash < Hash
91
91
 
92
92
  # Returns a nested HashWithIndifferentAccess where the values are symbols. Eg:
93
93
  # {
@@ -0,0 +1,36 @@
1
+ module Mutations
2
+ class FloatFilter < InputFilter
3
+ @default_options = {
4
+ nils: false, # true allows an explicit nil to be valid. Overrides any other options
5
+ # TODO: add strict
6
+ min: nil, # lowest value, inclusive
7
+ max: nil # highest value, inclusive
8
+ }
9
+
10
+ def filter(data)
11
+
12
+ # Handle nil case
13
+ if data.nil?
14
+ return [nil, nil] if options[:nils]
15
+ return [nil, :nils]
16
+ end
17
+
18
+ # Ensure it's the correct data type (Float)
19
+ if !data.is_a?(Float)
20
+ if data.is_a?(String) && data =~ /^[-+]?\d*\.?\d+/
21
+ data = data.to_f
22
+ elsif data.is_a?(Fixnum)
23
+ data = data.to_f
24
+ else
25
+ return [data, :float]
26
+ end
27
+ end
28
+
29
+ return [data, :min] if options[:min] && data < options[:min]
30
+ return [data, :max] if options[:max] && data > options[:max]
31
+
32
+ # We win, it's valid!
33
+ [data, nil]
34
+ end
35
+ end
36
+ end
@@ -108,6 +108,11 @@ module Mutations
108
108
  end
109
109
 
110
110
  data_element = data[key]
111
+
112
+ # First, discard optional nils/empty params
113
+ data.delete(key) if !is_required && data.has_key?(key) && filterer.discard_nils? && data_element.nil?
114
+ data.delete(key) if !is_required && data.has_key?(key) && filterer.discard_empty? && data_element == ""
115
+
111
116
  default_used = false
112
117
  if !data.has_key?(key) && filterer.has_default?
113
118
  data_element = filterer.default
@@ -134,6 +139,11 @@ module Mutations
134
139
 
135
140
  filtered_keys.each do |key|
136
141
  data_element = data[key]
142
+
143
+ # First, discard optional nils/empty params
144
+ next if data.has_key?(key) && wildcard_filterer.discard_nils? && data_element.nil?
145
+ next if data.has_key?(key) && wildcard_filterer.discard_empty? && data_element == ""
146
+
137
147
  sub_data, sub_error = wildcard_filterer.filter(data_element)
138
148
  if sub_error.nil?
139
149
  filtered_data[key] = sub_data
@@ -19,11 +19,20 @@ module Mutations
19
19
  end
20
20
 
21
21
  def has_default?
22
- self.options.has_key?(:default)
22
+ options.has_key?(:default)
23
23
  end
24
24
 
25
25
  def default
26
- self.options[:default]
26
+ options[:default]
27
+ end
28
+
29
+ # Only relevant for optional params
30
+ def discard_nils?
31
+ !options[:nils]
32
+ end
33
+
34
+ def discard_empty?
35
+ options[:discard_empty]
27
36
  end
28
37
  end
29
38
  end
@@ -1,14 +1,15 @@
1
1
  module Mutations
2
2
  class StringFilter < InputFilter
3
3
  @default_options = {
4
- strip: true, # true calls data.strip if data is a string
5
- strict: false, # If false, then symbols, numbers, and booleans are converted to a string with to_s. # TODO: TEST
6
- nils: false, # true allows an explicit nil to be valid. Overrides any other options
7
- empty: false, # false disallows "". true allows "" and overrides any other validations (b/c they couldn't be true if it's empty)
8
- min_length: nil, # Can be a number like 5, meaning that 5 codepoints are required
9
- max_length: nil, # Can be a number like 10, meaning that at most 10 codepoints are permitted
10
- matches: nil, # Can be a regexp
11
- in: nil # Can be an array like %w(red blue green)
4
+ strip: true, # true calls data.strip if data is a string
5
+ strict: false, # If false, then symbols, numbers, and booleans are converted to a string with to_s. # TODO: TEST
6
+ nils: false, # true allows an explicit nil to be valid. Overrides any other options
7
+ empty: false, # false disallows "". true allows "" and overrides any other validations (b/c they couldn't be true if it's empty)
8
+ min_length: nil, # Can be a number like 5, meaning that 5 codepoints are required
9
+ max_length: nil, # Can be a number like 10, meaning that at most 10 codepoints are permitted
10
+ matches: nil, # Can be a regexp
11
+ in: nil, # Can be an array like %w(red blue green)
12
+ discard_empty: false # If the param is optional, discard_empty: true drops empty fields.
12
13
  }
13
14
 
14
15
  def filter(data)
@@ -1,3 +1,3 @@
1
1
  module Mutations
2
- VERSION = "0.5.4"
2
+ VERSION = "0.5.9"
3
3
  end
@@ -0,0 +1,97 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe "Mutations::FloatFilter" do
4
+
5
+ it "allows floats" do
6
+ f = Mutations::FloatFilter.new
7
+ filtered, errors = f.filter(3.1415926)
8
+ assert_equal 3.1415926, filtered
9
+ assert_equal nil, errors
10
+ end
11
+
12
+ it "allows strings that start with a digit" do
13
+ f = Mutations::FloatFilter.new
14
+ filtered, errors = f.filter("3")
15
+ assert_equal 3.0, filtered
16
+ assert_equal nil, errors
17
+ end
18
+
19
+ it "allows string representation of float" do
20
+ f = Mutations::FloatFilter.new
21
+ filtered, errors = f.filter("3.14")
22
+ assert_equal 3.14, filtered
23
+ assert_equal nil, errors
24
+ end
25
+
26
+ it "allows string representation of float without a number before dot" do
27
+ f = Mutations::FloatFilter.new
28
+ filtered, errors = f.filter(".14")
29
+ assert_equal 0.14, filtered
30
+ assert_equal nil, errors
31
+ end
32
+
33
+ it "allows negative strings" do
34
+ f = Mutations::FloatFilter.new
35
+ filtered, errors = f.filter("-.14")
36
+ assert_equal -0.14, filtered
37
+ assert_equal nil, errors
38
+ end
39
+
40
+ it "allows strings with a positive sign" do
41
+ f = Mutations::FloatFilter.new
42
+ filtered, errors = f.filter("+.14")
43
+ assert_equal 0.14, filtered
44
+ assert_equal nil, errors
45
+ end
46
+
47
+ it "doesnt't allow other strings, nor does it allow random objects or symbols" do
48
+ f = Mutations::FloatFilter.new
49
+ ["zero","a1", {}, [], Object.new, :d].each do |thing|
50
+ filtered, errors = f.filter(thing)
51
+ assert_equal :float, errors
52
+ end
53
+ end
54
+
55
+ it "considers nil to be invalid" do
56
+ f = Mutations::FloatFilter.new(nils: false)
57
+ filtered, errors = f.filter(nil)
58
+ assert_equal nil, filtered
59
+ assert_equal :nils, errors
60
+ end
61
+
62
+ it "considers nil to be valid" do
63
+ f = Mutations::FloatFilter.new(nils: true)
64
+ filtered, errors = f.filter(nil)
65
+ assert_equal nil, filtered
66
+ assert_equal nil, errors
67
+ end
68
+
69
+ it "considers low numbers invalid" do
70
+ f = Mutations::FloatFilter.new(min: 10)
71
+ filtered, errors = f.filter(3)
72
+ assert_equal 3, filtered
73
+ assert_equal :min, errors
74
+ end
75
+
76
+ it "considers low numbers valid" do
77
+ f = Mutations::FloatFilter.new(min: 10)
78
+ filtered, errors = f.filter(31)
79
+ assert_equal 31, filtered
80
+ assert_equal nil, errors
81
+ end
82
+
83
+ it "considers high numbers invalid" do
84
+ f = Mutations::FloatFilter.new(max: 10)
85
+ filtered, errors = f.filter(31)
86
+ assert_equal 31, filtered
87
+ assert_equal :max, errors
88
+ end
89
+
90
+ it "considers high numbers vaild" do
91
+ f = Mutations::FloatFilter.new(max: 10)
92
+ filtered, errors = f.filter(3)
93
+ assert_equal 3, filtered
94
+ assert_equal nil, errors
95
+ end
96
+
97
+ end
@@ -32,8 +32,8 @@ describe "Mutations::HashFilter" do
32
32
  hf = Mutations::HashFilter.new do
33
33
  string :*
34
34
  end
35
- filtered, errors = hf.filter(foo: nil)
36
- assert_equal ({"foo" => :nils}), errors.symbolic
35
+ filtered, errors = hf.filter(foo: [])
36
+ assert_equal ({"foo" => :string}), errors.symbolic
37
37
  end
38
38
 
39
39
  it "allows a mix of specific keys and then wildcards" do
@@ -46,4 +46,107 @@ describe "Mutations::HashFilter" do
46
46
  assert_equal nil, errors
47
47
  end
48
48
 
49
+ it "doesn't allow a mix of specific keys and then wildcards -- should raise errors appropriately" do
50
+ hf = Mutations::HashFilter.new do
51
+ string :foo
52
+ integer :*
53
+ end
54
+ filtered, errors = hf.filter(foo: "bar", baz: "poopin")
55
+ assert_equal ({"baz" => :integer}), errors.symbolic
56
+ end
57
+
58
+ describe "optional params and nils" do
59
+ it "bar is optional -- it works if not passed" do
60
+ hf = Mutations::HashFilter.new do
61
+ required do
62
+ string :foo
63
+ end
64
+ optional do
65
+ string :bar
66
+ end
67
+ end
68
+
69
+ filtered, errors = hf.filter(foo: "bar")
70
+ assert_equal ({"foo" => "bar"}), filtered
71
+ assert_equal nil, errors
72
+ end
73
+
74
+ it "bar is optional -- it works if nil is passed" do
75
+ hf = Mutations::HashFilter.new do
76
+ required do
77
+ string :foo
78
+ end
79
+ optional do
80
+ string :bar
81
+ end
82
+ end
83
+
84
+ filtered, errors = hf.filter(foo: "bar", bar: nil)
85
+ assert_equal ({"foo" => "bar"}), filtered
86
+ assert_equal nil, errors
87
+ end
88
+
89
+ it "bar is optional -- it works if nil is passed and nils are allowed" do
90
+ hf = Mutations::HashFilter.new do
91
+ required do
92
+ string :foo
93
+ end
94
+ optional do
95
+ string :bar, nils: true
96
+ end
97
+ end
98
+
99
+ filtered, errors = hf.filter(foo: "bar", bar: nil)
100
+ assert_equal ({"foo" => "bar", "bar" => nil}), filtered
101
+ assert_equal nil, errors
102
+ end
103
+ end
104
+
105
+ describe "optional params and empty values" do
106
+ it "bar is optional -- discards empty" do
107
+ hf = Mutations::HashFilter.new do
108
+ required do
109
+ string :foo
110
+ end
111
+ optional do
112
+ string :bar, discard_empty: true
113
+ end
114
+ end
115
+
116
+ filtered, errors = hf.filter(foo: "bar", bar: "")
117
+ assert_equal ({"foo" => "bar"}), filtered
118
+ assert_equal nil, errors
119
+ end
120
+
121
+ it "bar is optional -- errors if discard_empty is false and value is blank" do
122
+ hf = Mutations::HashFilter.new do
123
+ required do
124
+ string :foo
125
+ end
126
+ optional do
127
+ string :bar, discard_empty: false
128
+ end
129
+ end
130
+
131
+ filtered, errors = hf.filter(foo: "bar", bar: "")
132
+ assert_equal ({"bar" => :empty}), errors.symbolic
133
+ end
134
+
135
+ it "bar is optional -- discards empty -- now with wildcards" do
136
+ hf = Mutations::HashFilter.new do
137
+ required do
138
+ string :foo
139
+ end
140
+ optional do
141
+ string :*, discard_empty: true
142
+ end
143
+ end
144
+
145
+ filtered, errors = hf.filter(foo: "bar", bar: "")
146
+ assert_equal ({"foo" => "bar"}), filtered
147
+ assert_equal nil, errors
148
+ end
149
+ end
150
+
151
+
49
152
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mutations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-22 00:00:00.000000000 Z
12
+ date: 2013-02-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -73,12 +73,14 @@ files:
73
73
  - MIT-LICENSE
74
74
  - README.md
75
75
  - Rakefile
76
+ - TODO
76
77
  - lib/mutations.rb
77
78
  - lib/mutations/array_filter.rb
78
79
  - lib/mutations/boolean_filter.rb
79
80
  - lib/mutations/command.rb
80
81
  - lib/mutations/errors.rb
81
82
  - lib/mutations/exception.rb
83
+ - lib/mutations/float_filter.rb
82
84
  - lib/mutations/hash_filter.rb
83
85
  - lib/mutations/input_filter.rb
84
86
  - lib/mutations/integer_filter.rb
@@ -92,6 +94,7 @@ files:
92
94
  - spec/command_spec.rb
93
95
  - spec/default_spec.rb
94
96
  - spec/errors_spec.rb
97
+ - spec/float_filter_spec.rb
95
98
  - spec/hash_filter_spec.rb
96
99
  - spec/inheritance_spec.rb
97
100
  - spec/integer_filter_spec.rb