hanami-controller 1.1.0.beta1 → 1.1.0.beta2

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
2
  SHA1:
3
- metadata.gz: 79d8fab970716e6c18ccce8a0e594ab23ff0e611
4
- data.tar.gz: 1f7d27447cb47de7188bceae96aef46d32e48fb9
3
+ metadata.gz: 158fe86057c438e5d32d4deafa0913972f98db7a
4
+ data.tar.gz: e2b1ab0f2a7edbc8ac0ccac2cc53a8bd13971c6a
5
5
  SHA512:
6
- metadata.gz: fbd7ab49602fc8f4d7639eb4c59a8629b2eb1f32d35585e71fa21d5c1ec698509efe1511a4aa1cfe1273161ad63da75948c8ccb69d6abdda3e1bb6a8417b4daa
7
- data.tar.gz: 6b4580064f085f43cff37b4a94b273241e633b98a4f452d8e8655ba2fad6654c4dcc4807d16bb777ee88a0755c5f31fe002d2525babe08ce8c113284f110d0bc
6
+ metadata.gz: 89839ef85004ad52c5ca5a4318b8bae4e95bee858d6f6c15b72a7031440600ebc8f00669c1bf3aac0073834d08e24983ba18e47404ef8dc565933e10da308d6b
7
+ data.tar.gz: d2851a8b925d3c22a59b0469bcd61edead0d977af5a8713931d90b4060f8d44090741a10caeda8a749db22b4f6c63ac9ed390197c90f645c726587a6d1372ee0
data/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # Hanami::Controller
2
2
  Complete, fast and testable actions for Rack
3
3
 
4
+ ## v1.1.0.beta2 - 2017-10-03
5
+ ### Added
6
+ - [Luca Guidi] Introduce `Hanami::Action::Params::Errors#add` to add errors not generated by params validations
7
+
4
8
  ## v1.1.0.beta1 - 2017-08-11
5
9
 
6
10
  ## v1.0.1 - 2017-07-10
@@ -20,10 +20,10 @@ Gem::Specification.new do |spec|
20
20
  spec.required_ruby_version = '>= 2.3.0'
21
21
 
22
22
  spec.add_dependency 'rack', '~> 2.0'
23
- spec.add_dependency 'hanami-utils', '1.1.0.beta1'
23
+ spec.add_dependency 'hanami-utils', '1.1.0.beta2'
24
24
 
25
25
  spec.add_development_dependency 'bundler', '~> 1.6'
26
26
  spec.add_development_dependency 'rack-test', '~> 0.6'
27
- spec.add_development_dependency 'rake', '~> 11'
28
- spec.add_development_dependency 'rspec', '~> 3.5'
27
+ spec.add_development_dependency 'rake', '~> 12'
28
+ spec.add_development_dependency 'rspec', '~> 3.6'
29
29
  end
@@ -16,6 +16,100 @@ module Hanami
16
16
  class Params < BaseParams
17
17
  include Hanami::Validations::Form
18
18
 
19
+ # Params errors
20
+ #
21
+ # @since 1.1.0
22
+ class Errors < SimpleDelegator
23
+ # @since 1.1.0
24
+ # @api private
25
+ def initialize(errors = {})
26
+ super(errors)
27
+ end
28
+
29
+ # Add an error to the param validations
30
+ #
31
+ # This has a semantic similar to `Hash#dig` where you use a set of keys
32
+ # to get a nested value, here you use a set of keys to set a nested
33
+ # value.
34
+ #
35
+ # @param args [Array<Symbol, String>] an array of arguments: the last
36
+ # one is the message to add (String), while the beginning of the array
37
+ # is made of keys to reach the attribute.
38
+ #
39
+ # @raise [ArgumentError] when try to add a message for a key that is
40
+ # already filled with incompatible message type.
41
+ # This usually happens with nested attributes: if you have a `:book`
42
+ # schema and the input doesn't include data for `:book`, the messages
43
+ # will be `["is missing"]`. In that case you can't add an error for a
44
+ # key nested under `:book`.
45
+ #
46
+ # @since 1.1.0
47
+ #
48
+ # @example Basic usage
49
+ # require "hanami/controller"
50
+ #
51
+ # class MyAction
52
+ # include Hanami::Action
53
+ #
54
+ # params do
55
+ # required(:book).schema do
56
+ # required(:isbn).filled(:str?)
57
+ # end
58
+ # end
59
+ #
60
+ # def call(params)
61
+ # # 1. Don't try to save the record if the params aren't valid
62
+ # return unless params.valid?
63
+ #
64
+ # BookRepository.new.create(params[:book])
65
+ # rescue Hanami::Model::UniqueConstraintViolationError
66
+ # # 2. Add an error in case the record wasn't unique
67
+ # params.errors.add(:book, :isbn, "is not unique")
68
+ # end
69
+ # end
70
+ #
71
+ # @example Invalid argument
72
+ # require "hanami/controller"
73
+ #
74
+ # class MyAction
75
+ # include Hanami::Action
76
+ #
77
+ # params do
78
+ # required(:book).schema do
79
+ # required(:title).filled(:str?)
80
+ # end
81
+ # end
82
+ #
83
+ # def call(params)
84
+ # puts params.to_h # => {}
85
+ # puts params.valid? # => false
86
+ # puts params.error_messages # => ["Book is missing"]
87
+ # puts params.errors # => {:book=>["is missing"]}
88
+ #
89
+ # params.errors.add(:book, :isbn, "is not unique") # => ArgumentError
90
+ # end
91
+ # end
92
+ def add(*args)
93
+ *keys, key, error = args
94
+ _nested_attribute(keys, key) << error
95
+ rescue TypeError
96
+ raise ArgumentError.new("Can't add #{args.map(&:inspect).join(', ')} to #{inspect}")
97
+ end
98
+
99
+ private
100
+
101
+ # @since 1.1.0
102
+ # @api private
103
+ def _nested_attribute(keys, key)
104
+ if keys.empty?
105
+ self
106
+ else
107
+ keys.inject(self) { |result, k| result[k] ||= {} }
108
+ dig(*keys)
109
+ end[key] ||= []
110
+ end
111
+ end
112
+
19
113
  # This is a Hanami::Validations extension point
20
114
  #
21
115
  # @since 0.7.0
@@ -71,6 +165,7 @@ module Hanami
71
165
  super(_extract_params)
72
166
  @result = validate
73
167
  @params = _params
168
+ @errors = Errors.new(@result.messages)
74
169
  freeze
75
170
  end
76
171
 
@@ -92,9 +187,7 @@ module Hanami
92
187
  # @example
93
188
  # params.errors
94
189
  # # => {:email=>["is missing", "is in invalid format"], :name=>["is missing"], :tos=>["is missing"], :age=>["is missing"], :address=>["is missing"]}
95
- def errors
96
- @result.messages
97
- end
190
+ attr_reader :errors
98
191
 
99
192
  # Returns flat collection of full error messages
100
193
  #
@@ -129,7 +222,7 @@ module Hanami
129
222
  # @example
130
223
  # params.valid? # => true
131
224
  def valid?
132
- @result.success?
225
+ errors.empty?
133
226
  end
134
227
 
135
228
  # Serialize params to Hash
@@ -3,6 +3,6 @@ module Hanami
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '1.1.0.beta1'.freeze
6
+ VERSION = '1.1.0.beta2'.freeze
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.beta1
4
+ version: 1.1.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-11 00:00:00.000000000 Z
11
+ date: 2017-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 1.1.0.beta1
33
+ version: 1.1.0.beta2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 1.1.0.beta1
40
+ version: 1.1.0.beta2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,28 +72,28 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '11'
75
+ version: '12'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '11'
82
+ version: '12'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.5'
89
+ version: '3.6'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '3.5'
96
+ version: '3.6'
97
97
  description: Complete, fast and testable actions for Rack
98
98
  email:
99
99
  - me@lucaguidi.com
@@ -158,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
158
  version: 1.3.1
159
159
  requirements: []
160
160
  rubyforge_project:
161
- rubygems_version: 2.6.11
161
+ rubygems_version: 2.6.13
162
162
  signing_key:
163
163
  specification_version: 4
164
164
  summary: Complete, fast and testable actions for Rack and Hanami