mutations 0.8.1 → 0.8.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8bff02ac61eeda799b03898f3e376a661b96396d
4
- data.tar.gz: 79b7261aa23b98f03130c7a102643659045bf75e
2
+ SHA256:
3
+ metadata.gz: f9df957aca8cdb7ad065a71ade7fb1ccf48091e025e73f395822f53dab1de255
4
+ data.tar.gz: a6a3df2daca41bb6886bc76c75027f28d131c483d69120a10a5b108c79f549c7
5
5
  SHA512:
6
- metadata.gz: 602de12b62d392455d81710757f7461c40239e0a625dd3908a8f1e9ab16c13d94153c5e60f10cbef833b0c88ee5d103771352e147e33949d70a260a856a1326a
7
- data.tar.gz: e379aafc135a683190577f75644f283958092e670bfac3522e1ed4cdfe718cd207183d657b7f95de4600a4e4c6eed6d58834b3835bedb6b9615601d7231b5329
6
+ metadata.gz: e4ba37c6965c370d1d5cf39a28dcdb1a854e72ca0ad7ae91c5612bce03d2c35e09431eb21ffc4e46ec212d3806a89562517fea37eba2fdfce3683cfae0a0bb21
7
+ data.tar.gz: 5ed2f4404656a7646dbfb93a69f2bc7008c5182d44e2bb66e3e1ba9a259cd100c56e4849cb6ec5bd923d919db2aee25c2a8d7888862066f15e0b763a28bc67f2
@@ -1,3 +1,8 @@
1
+ 0.8.2
2
+ -----------
3
+ - Add `:error_key` filter option to allow error messages to be customised. (#115, @mwhatters)
4
+ - Accept hash inputs that respond to `to_hash`. (#126, @antoniobg)
5
+
1
6
  0.8.1
2
7
  -----------
3
8
  - Ruby 2.4 support added
@@ -56,7 +56,7 @@ module Mutations
56
56
  # Instance methods
57
57
  def initialize(*args)
58
58
  @raw_inputs = args.inject({}.with_indifferent_access) do |h, arg|
59
- raise ArgumentError.new("All arguments must be hashes") unless arg.is_a?(Hash)
59
+ raise ArgumentError.new("All arguments must be hashes") unless arg.respond_to?(:to_hash)
60
60
  h.merge!(arg)
61
61
  end
62
62
 
@@ -79,11 +79,11 @@ module Mutations
79
79
  end
80
80
 
81
81
  # Ensure it's a hash
82
- return [data, :hash] unless data.is_a?(Hash)
82
+ return [data, :hash] unless data.respond_to?(:to_hash)
83
83
 
84
- # We always want a hash with indiffernet access
84
+ # We always want a hash with indifferent access
85
85
  unless data.is_a?(HashWithIndifferentAccess)
86
- data = data.with_indifferent_access
86
+ data = data.to_hash.with_indifferent_access
87
87
  end
88
88
 
89
89
  errors = ErrorHash.new
@@ -113,16 +113,18 @@ module Mutations
113
113
  elsif !is_required && sub_error == :nils && filterer.discard_nils?
114
114
  data.delete(key)
115
115
  else
116
- sub_error = ErrorAtom.new(key, sub_error) if sub_error.is_a?(Symbol)
116
+ error_key = filterer.options[:error_key] || key
117
+ sub_error = ErrorAtom.new(error_key, sub_error) if sub_error.is_a?(Symbol)
117
118
  errors[key] = sub_error
118
119
  end
119
120
  end
120
-
121
+
121
122
  if !data.has_key?(key)
122
123
  if filterer.has_default?
123
124
  filtered_data[key] = filterer.default
124
125
  elsif is_required
125
- errors[key] = ErrorAtom.new(key, :required)
126
+ error_key = filterer.options[:error_key] || key
127
+ errors[key] = ErrorAtom.new(error_key, :required)
126
128
  end
127
129
  end
128
130
  end
@@ -1,3 +1,3 @@
1
1
  module Mutations
2
- VERSION = "0.8.1"
2
+ VERSION = "0.8.2"
3
3
  end
@@ -59,12 +59,12 @@ describe "Command" do
59
59
 
60
60
  it "should execute custom validate method during run" do
61
61
  outcome = SimpleCommand.run(:name => "JohnLong", :email => "xxxx")
62
-
62
+
63
63
  assert !outcome.success?
64
64
  assert_nil outcome.result
65
65
  assert_equal :invalid, outcome.errors.symbolic[:email]
66
66
  end
67
-
67
+
68
68
  it "should execute custom validate method only if regular validations succeed" do
69
69
  outcome = SimpleCommand.validate(:name => "JohnTooLong", :email => "xxxx")
70
70
 
@@ -87,7 +87,7 @@ describe "Command" do
87
87
  assert_equal ({:name => "John", :email => "bob@jones.com", :amount => 5}).stringify_keys, outcome.result
88
88
  end
89
89
 
90
- it "shouldn't accept non-hashes" do
90
+ it "shouldn't accept objects that are not hashes or directly mappable to hashes" do
91
91
  assert_raises ArgumentError do
92
92
  SimpleCommand.run(nil)
93
93
  end
@@ -101,6 +101,19 @@ describe "Command" do
101
101
  end
102
102
  end
103
103
 
104
+ it 'should accept objects that are conceptually hashes' do
105
+ class CustomPersonHash
106
+ def to_hash
107
+ { name: 'John', email: 'john@example.com' }
108
+ end
109
+ end
110
+
111
+ outcome = SimpleCommand.run(CustomPersonHash.new)
112
+
113
+ assert outcome.success?
114
+ assert_equal ({ name: "John", email: "john@example.com" }).stringify_keys, outcome.result
115
+ end
116
+
104
117
  it "should accept nothing at all" do
105
118
  SimpleCommand.run # make sure nothing is raised
106
119
  end
@@ -168,6 +181,29 @@ describe "Command" do
168
181
  end
169
182
  end
170
183
 
184
+ describe "CustomErrorKeyCommand" do
185
+ class CustomErrorKeyCommand < Mutations::Command
186
+ required { string :name, error_key: :other_name }
187
+ optional { string :email, min_length: 4, error_key: :other_email }
188
+ end
189
+
190
+ it "should return the optional error key in the error message if required" do
191
+ outcome = CustomErrorKeyCommand.run
192
+
193
+ assert !outcome.success?
194
+ assert_equal :required, outcome.errors.symbolic[:name]
195
+ assert_equal "Other Name is required", outcome.errors.message[:name]
196
+ end
197
+
198
+ it "should return the optional error key in the error message if optional" do
199
+ outcome = CustomErrorKeyCommand.run(email: "foo")
200
+
201
+ assert !outcome.success?
202
+ assert_equal :min_length, outcome.errors.symbolic[:email]
203
+ assert_equal "Other Email is too short", outcome.errors.message[:email]
204
+ end
205
+ end
206
+
171
207
  describe "NestingErrorfulCommand" do
172
208
  class NestingErrorfulCommand < Mutations::Command
173
209
 
@@ -20,6 +20,18 @@ describe "Mutations::HashFilter" do
20
20
  assert_equal :hash, errors
21
21
  end
22
22
 
23
+ it "allows non-hashes that implement #to_hash" do
24
+ input = Object.new
25
+ def input.to_hash
26
+ {:foo => "bar"}
27
+ end
28
+ hf = Mutations::HashFilter.new do
29
+ string :foo
30
+ end
31
+ _filtered, errors = hf.filter(input)
32
+ assert_equal nil, errors
33
+ end
34
+
23
35
  it "allows wildcards in hashes" do
24
36
  hf = Mutations::HashFilter.new do
25
37
  string :*
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.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Novak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-24 00:00:00.000000000 Z
11
+ date: 2018-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -126,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
126
  version: '0'
127
127
  requirements: []
128
128
  rubyforge_project:
129
- rubygems_version: 2.5.1
129
+ rubygems_version: 2.7.6
130
130
  signing_key:
131
131
  specification_version: 4
132
132
  summary: Compose your business logic into commands that sanitize and validate input.