reform 2.1.0.rc1 → 2.1.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.
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