reform 2.1.0.rc1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6fd73b0dc59751240c4ec4518477b225c5becf81
4
- data.tar.gz: 1a6a1e8eba9f547424e533698129299afbdc8a93
3
+ metadata.gz: 22e0b3849f8a705c51f5e805dfaca960279b8d3d
4
+ data.tar.gz: 1fa928b3309dcca60a1c5801a58acca34d7996ee
5
5
  SHA512:
6
- metadata.gz: 59066ba1ed67fc72da96561cb77f4dfcf3750c2840ce825b55344851476a09feba5e8222b2aa75d560014c027ce313f2896ad49b651c6de7a52ede2cee0db854
7
- data.tar.gz: 57f67e136f2e7ea8c99db1baaab671a26ae6ebbfb62066564048c38ccd3bbc8b1846a54733b9f5629bb01d32085470649fa4f7c255f35042eab5f7fc9b990b69
6
+ metadata.gz: 5daaf2a361ee1a200b7d300f926ff6e4acf7503d73b5b3dcde106201d9b6bcf8a015ba4472ba5496a67af48af7be7bd4879d6afa6ed2cee649ec776ec437afea
7
+ data.tar.gz: 1adf91b4dfd4de9e14871b7f56953cd83ce765d6d1576858314ba4416f9c15c0d9eaad57b26b450345c8d4420ffd3ff524b67df210665d9f4268f4484a9b8894
data/CHANGES.md CHANGED
@@ -1,15 +1,24 @@
1
- ## 2.1
1
+ ## 2.1.0
2
+
3
+ You should be able to upgrade from 2.0 without any code changes.
2
4
 
3
5
  ### Awesomeness
4
6
 
5
7
  * You can now have `:populator` for scalar properties, too. This allows "parsing code" per property which is super helpful to structure your deserialization.
6
8
  * `:populator` can be a method name, as in `populator: :populate_authors!`.
7
- * Populators can now skip deserialization of a nested fragment using `skip!`. [Learn more here](http://trailblazer.to/gems/reform/populator.html).
8
- * Added basic support for dry-validation as a future replacement for ActiveModel::Validation. Note that this is still experimental, but feel free to test.
9
+ * Populators can now skip deserialization of a nested fragment using `skip!`. [Learn more here](http://trailblazer.to/gems/reform/populator.html#skip).
10
+ * Added support for dry-validation as a future replacement for ActiveModel::Validation. Note that this is still experimental, but works great.
11
+ * Added validation groups.
12
+
13
+ ### Changes
9
14
 
10
- * :populator ->(options) or ->(fragment:, model:, **o)
15
+ * All lambda APIs change (with deprecation): `populator: ->(options)` or `->(fragment:, model:, **o)` where we only receive one hash instead of a varying number or arguments. This is pretty cool and should be listed under _Awesomeness_.
11
16
  * `ActiveModel::Validator` prevents Rails from adding methods to it. This makes `acceptance` and `confirmation` validations work properly.
12
17
 
18
+ ### Notes
19
+
20
+ * Please be warned that we will drop support for `ActiveModel::Validations` from 2.2 onwards. Don't worry, it will still work, but we don't want to work with it anymore.
21
+
13
22
  ## 2.0.5
14
23
 
15
24
  * `ActiveModel::Validator` now delegates all methods properly to the form. It used to crashed with properties called `format` or other private `Object` methods.
data/Gemfile CHANGED
@@ -13,5 +13,4 @@ gemspec
13
13
  # gem "declarative", path: "../declarative"
14
14
 
15
15
  gem "minitest-line"
16
- gem 'dry-validation'
17
- gem 'byebug'
16
+ gem 'byebug'
Binary file
@@ -33,6 +33,7 @@ module Reform
33
33
  args.each { |name| property(name, options.dup) }
34
34
  end
35
35
 
36
+ require "reform/contract/errors"
36
37
  require 'reform/contract/validate'
37
38
  include Reform::Contract::Validate
38
39
 
@@ -40,6 +41,7 @@ module Reform
40
41
  include Reform::Validation # ::validates and #valid?
41
42
 
42
43
 
44
+
43
45
  # module ValidatesWarning
44
46
  # def validates(*)
45
47
  # raise "[Reform] Please include either Reform::Form::ActiveModel::Validations or Reform::Form::Lotus in your form class."
@@ -0,0 +1,43 @@
1
+ class Reform::Contract::Errors
2
+ def initialize(*)
3
+ @errors = {}
4
+ end
5
+
6
+ module Merge
7
+ def merge!(errors, prefix)
8
+ errors.messages.each do |field, msgs|
9
+ unless field.to_sym == :base
10
+ field = (prefix+[field]).join(".").to_sym # TODO: why is that a symbol in Rails?
11
+ end
12
+
13
+ msgs.each do |msg|
14
+ next if messages[field] and messages[field].include?(msg)
15
+ add(field, msg)
16
+ end # Forms now contains a plain errors hash. the errors for each item are still available in item.errors.
17
+ end
18
+ end
19
+
20
+ def to_s
21
+ messages.inspect
22
+ end
23
+ end
24
+ include Merge
25
+
26
+ def add(field, message)
27
+ @errors[field] ||= []
28
+ @errors[field] << message
29
+ end
30
+
31
+ def messages
32
+ @errors
33
+ end
34
+
35
+ def empty?
36
+ @errors.empty?
37
+ end
38
+
39
+ # needed by Rails form builder.
40
+ def [](name)
41
+ @errors[name] || []
42
+ end
43
+ end
@@ -1,5 +1,4 @@
1
1
  require "active_model"
2
- require "reform/form/active_model/errors"
3
2
  require "uber/delegates"
4
3
 
5
4
  module Reform::Form::ActiveModel
@@ -35,7 +34,7 @@ module Reform::Form::ActiveModel
35
34
  end
36
35
 
37
36
  def build_errors
38
- Reform::Contract::Errors.new(self)
37
+ Errors.new(self)
39
38
  end
40
39
 
41
40
  # The concept of "composition" has still not arrived in Rails core and they rely on 400 methods being
@@ -101,4 +100,8 @@ module Reform::Form::ActiveModel
101
100
  end
102
101
  end
103
102
  end
103
+
104
+ class Errors < ActiveModel::Errors
105
+ include Reform::Form::Errors::Merge
106
+ end
104
107
  end
@@ -1,6 +1,6 @@
1
1
  require "dry-validation"
2
- require "reform/validation"
3
2
  require "dry/validation/schema/form"
3
+ require "reform/validation"
4
4
 
5
5
  module Reform::Form::Dry
6
6
  module Validations
@@ -31,11 +31,10 @@ module Reform::Form::Dry
31
31
  def call(fields, reform_errors, form)
32
32
  validator = @validator.new(form)
33
33
 
34
- validator.call(fields).messages.each do |dry_error|
35
- # a dry error message looks like this:
36
- # [:email, [['Please provide your email', '']]]
37
- dry_error[1].each do |attr_error|
38
- reform_errors.add(dry_error[0], attr_error[0])
34
+ # a message item looks like: {:confirm_password=>[["confirm_password size cannot be less than 2"], "9"]}
35
+ validator.call(fields).messages.each do |field, dry_error|
36
+ dry_error[0].each do |attr_error|
37
+ reform_errors.add(field, attr_error)
39
38
  end
40
39
  end
41
40
  end
@@ -1,3 +1,3 @@
1
1
  module Reform
2
- VERSION = "2.1.0.rc1"
2
+ VERSION = "2.1.0"
3
3
  end
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_dependency "disposable", ">= 0.2.1", "< 0.3.0"
20
+ spec.add_dependency "disposable", ">= 0.2.2", "< 0.3.0"
21
21
  spec.add_dependency "uber", "~> 0.0.11"
22
22
  spec.add_dependency "representable", ">= 2.4.0", "< 3.1.0"
23
23
 
@@ -32,6 +32,6 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "multi_json"
33
33
 
34
34
  spec.add_development_dependency "lotus-validations"
35
- spec.add_development_dependency "dry-validation"
35
+ spec.add_development_dependency "dry-validation", ">= 0.4.0"
36
36
  spec.add_development_dependency "actionpack"
37
37
  end
@@ -40,4 +40,5 @@ str?: "%{name} must be a string"
40
40
 
41
41
  good_musical_taste?: "you're a bad person"
42
42
 
43
- form_access_validation?: "this doesn't look like a Reform form dude!!"
43
+ form_access_validation?: "this doesn't look like a Reform form dude!!"
44
+
@@ -89,7 +89,7 @@ class ReformTest < ReformSpec
89
89
  describe "#errors" do
90
90
  before { form.validate({})}
91
91
 
92
- it { form.errors.must_be_kind_of Reform::Form::Errors }
92
+ it { form.errors.must_be_kind_of Reform::Form::ActiveModel::Errors }
93
93
 
94
94
  it { form.errors.messages.must_equal({}) }
95
95
 
@@ -59,18 +59,18 @@ class ValidationGroupsTest < MiniTest::Spec
59
59
  # 2nd group fails.
60
60
  it do
61
61
  form.validate(username: "Helloween", email: "yo", confirm_password:"9").must_equal false
62
- form.errors.messages.inspect.must_equal "{:email=>[\"email size cannot be less than 3\"], :confirm_password=>[\"confirm_password size cannot be less than 2\"], :password=>[\"password must be filled\"]}"
62
+ form.errors.messages.inspect.must_equal "{:email=>[\"email size cannot be less than 3\"], :confirm_password=>[\"confirm_password size cannot be less than 2\"], :password=>[\"password must be filled\", \"password size cannot be less than 2\"]}"
63
63
  end
64
64
  # 3rd group fails.
65
65
  it do
66
66
  form.validate(username: "Helloween", email: "yo!", confirm_password:"9").must_equal false
67
67
  form.errors.messages.inspect
68
- .must_equal "{:confirm_password=>[\"confirm_password size cannot be less than 2\"], :password=>[\"password must be filled\"]}"
68
+ .must_equal "{:confirm_password=>[\"confirm_password size cannot be less than 2\"], :password=>[\"password must be filled\", \"password size cannot be less than 2\"]}"
69
69
  end
70
70
  # 4th group with after: fails.
71
71
  it do
72
72
  form.validate(username: "Helloween", email: "yo!", password: "", confirm_password: "9").must_equal false
73
- form.errors.messages.inspect.must_equal "{:confirm_password=>[\"confirm_password size cannot be less than 2\"], :password=>[\"password must be filled\"]}"
73
+ form.errors.messages.inspect.must_equal "{:confirm_password=>[\"confirm_password size cannot be less than 2\"], :password=>[\"password must be filled\", \"password size cannot be less than 2\"]}"
74
74
  end
75
75
  end
76
76
 
@@ -104,7 +104,7 @@ class ValidationGroupsTest < MiniTest::Spec
104
104
 
105
105
  validation :default do
106
106
  configure { |config|
107
- config.messages_file = 'test/fixtures/dry_error_messages.yml'
107
+ # config.messages_file = 'test/fixtures/dry_error_messages.yml'
108
108
  }
109
109
 
110
110
  key(:title) do |title|
@@ -167,7 +167,7 @@ class ValidationGroupsTest < MiniTest::Spec
167
167
  validates(:email, &:filled?)
168
168
  end
169
169
  end
170
- end.must_raise
170
+ end.must_raise(NoMethodError)
171
171
  # e.message.must_equal 'validates() is not supported by Dry Validation backend.'
172
172
 
173
173
  e = proc do
@@ -193,8 +193,8 @@ class ValidationGroupsTest < MiniTest::Spec
193
193
  validates_with(:email, &:filled?)
194
194
  end
195
195
  end
196
- end.must_raise
197
- # e.message.must_equal 'validates_with() is not supported by Dry Validation backend.'
196
+ end.must_raise(NoMethodError)
197
+ # e.message.must_equal (NoMethodError)'validates_with() is not supported by Dry Validation backend.'
198
198
  end
199
199
  end
200
200
 
@@ -327,4 +327,4 @@ class ValidationGroupsTest < MiniTest::Spec
327
327
  # form.errors.messages.inspect.must_equal "{:username=>[\"username must be filled\", \"username is not proper size\"]}"
328
328
  # end
329
329
  # end
330
- end
330
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reform
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0.rc1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-12-21 00:00:00.000000000 Z
12
+ date: 2015-12-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: disposable
@@ -17,7 +17,7 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 0.2.1
20
+ version: 0.2.2
21
21
  - - "<"
22
22
  - !ruby/object:Gem::Version
23
23
  version: 0.3.0
@@ -27,7 +27,7 @@ dependencies:
27
27
  requirements:
28
28
  - - ">="
29
29
  - !ruby/object:Gem::Version
30
- version: 0.2.1
30
+ version: 0.2.2
31
31
  - - "<"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.3.0
@@ -211,14 +211,14 @@ dependencies:
211
211
  requirements:
212
212
  - - ">="
213
213
  - !ruby/object:Gem::Version
214
- version: '0'
214
+ version: 0.4.0
215
215
  type: :development
216
216
  prerelease: false
217
217
  version_requirements: !ruby/object:Gem::Requirement
218
218
  requirements:
219
219
  - - ">="
220
220
  - !ruby/object:Gem::Version
221
- version: '0'
221
+ version: 0.4.0
222
222
  - !ruby/object:Gem::Dependency
223
223
  name: actionpack
224
224
  requirement: !ruby/object:Gem::Requirement
@@ -258,10 +258,10 @@ files:
258
258
  - lib/reform.rb
259
259
  - lib/reform/active_record.rb
260
260
  - lib/reform/contract.rb
261
+ - lib/reform/contract/errors.rb
261
262
  - lib/reform/contract/validate.rb
262
263
  - lib/reform/form.rb
263
264
  - lib/reform/form/active_model.rb
264
- - lib/reform/form/active_model/errors.rb
265
265
  - lib/reform/form/active_model/form_builder_methods.rb
266
266
  - lib/reform/form/active_model/model_reflections.rb
267
267
  - lib/reform/form/active_model/model_validations.rb
@@ -373,9 +373,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
373
373
  version: '0'
374
374
  required_rubygems_version: !ruby/object:Gem::Requirement
375
375
  requirements:
376
- - - ">"
376
+ - - ">="
377
377
  - !ruby/object:Gem::Version
378
- version: 1.3.1
378
+ version: '0'
379
379
  requirements: []
380
380
  rubyforge_project:
381
381
  rubygems_version: 2.4.8
@@ -1,23 +0,0 @@
1
- # The Errors class is planned to replace AM::Errors. It provides proper nested error messages.
2
- class Reform::Contract::Errors < ActiveModel::Errors
3
- def merge!(errors, prefix)
4
- errors.messages.each do |field, msgs|
5
- unless field.to_sym == :base
6
- field = (prefix+[field]).join(".").to_sym # TODO: why is that a symbol in Rails?
7
- end
8
-
9
- msgs.each do |msg|
10
- next if messages[field] and messages[field].include?(msg)
11
- add(field, msg)
12
- end # Forms now contains a plain errors hash. the errors for each item are still available in item.errors.
13
- end
14
- end
15
-
16
- def valid? # TODO: test me in unit test.
17
- empty?
18
- end
19
-
20
- def to_s
21
- messages.inspect
22
- end
23
- end # Errors