reform 1.2.2 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +10 -0
- data/README.md +2 -2
- data/TODO.md +1 -1
- data/database.sqlite3 +0 -0
- data/lib/reform/contract.rb +13 -5
- data/lib/reform/form/model_reflections.rb +19 -0
- data/lib/reform/form/sync.rb +9 -5
- data/lib/reform/version.rb +1 -1
- data/test/model_reflections_test.rb +71 -2
- data/test/sync_test.rb +14 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 777f16f9f2f9f029ad3d3b9ee1cdd2b12ec31bb7
|
4
|
+
data.tar.gz: a1dc7b0e61b13090a6a67bda43520104c58e502d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ca591099b12b4b519311e74d1bb89c7251473b2f827115d7c56c9880886a8a9f76f4326d48d386dc4d36f42c753ccf74bedb088d714524764022a5a7b316dea
|
7
|
+
data.tar.gz: efb2ea5be6e19226fbe2ad6f9741380e9ab5a2b1630fcd96dabb146c0c26cb8478a7668ef7ff378170d1a7e66842a2c9b646ffb120d971bb37eaa438c9018116
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## 1.2.3
|
2
|
+
|
3
|
+
* Make `ModelReflections` work with simple_form 3.1.0. (#176). It also provides `defined_enums` and `::reflect_on_association` now.
|
4
|
+
* `nil` values passed into `#validate` will now be written to the model in `#sync` (#175). Formerly, only blank strings and values evaluating to true were considered when syncing. This allows blanking fields of the model as follows.
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
form.validate(title: nil)
|
8
|
+
```
|
9
|
+
* Calling `Form::reform_2_0!` will now properly inherit to nested forms.
|
10
|
+
|
1
11
|
## 1.2.2
|
2
12
|
|
3
13
|
* Use new `uber` to allow subclassing `reform_2_0!` forms.
|
data/README.md
CHANGED
@@ -48,7 +48,7 @@ Luckily, this can be shortened as follows.
|
|
48
48
|
```ruby
|
49
49
|
class SongForm < Reform::Form
|
50
50
|
property :title, validates: {presence: true}
|
51
|
-
property :length, validates {numericality: true}
|
51
|
+
property :length, validates: {numericality: true}
|
52
52
|
end
|
53
53
|
```
|
54
54
|
|
@@ -905,7 +905,7 @@ You can also provide the sync lambda at run-time.
|
|
905
905
|
form.sync(title: lambda { |value, options| form.model.title = "HOT: #{value}" })
|
906
906
|
```
|
907
907
|
|
908
|
-
This block is run in the caller's context allowing you to access environment variables. Note that the dynamic sync happens _before_ save, so the model id may unavailable.
|
908
|
+
This block is run in the caller's context allowing you to access environment variables. Note that the dynamic sync happens _before_ save, so the model id may be unavailable.
|
909
909
|
|
910
910
|
You can do the same for saving.
|
911
911
|
|
data/TODO.md
CHANGED
data/database.sqlite3
CHANGED
Binary file
|
data/lib/reform/contract.rb
CHANGED
@@ -164,11 +164,6 @@ module Reform
|
|
164
164
|
end
|
165
165
|
end
|
166
166
|
|
167
|
-
inheritable_attr :reform_2_0 # TODO: remove me in 2.0.
|
168
|
-
def self.reform_2_0!
|
169
|
-
self.reform_2_0= true
|
170
|
-
end
|
171
|
-
|
172
167
|
def self.register_feature(mod)
|
173
168
|
features[mod] = true
|
174
169
|
end
|
@@ -196,6 +191,19 @@ module Reform
|
|
196
191
|
|
197
192
|
alias_method :aliased_model, :model
|
198
193
|
|
194
|
+
# TODO: remove me in 2.0.
|
195
|
+
module Reform20Switch
|
196
|
+
def self.included(base)
|
197
|
+
base.register_feature(Reform20Switch)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
def self.reform_2_0!
|
201
|
+
include Reform20Switch
|
202
|
+
end
|
203
|
+
def self.reform_2_0
|
204
|
+
features[Reform20Switch]
|
205
|
+
end
|
206
|
+
|
199
207
|
|
200
208
|
# Keeps values of the form fields. What's in here is to be displayed in the browser!
|
201
209
|
# we need this intermediate object to display both "original values" and new input from the form after submitting.
|
@@ -5,14 +5,33 @@
|
|
5
5
|
# doesn't have to "guess" what simple_form and other form helpers need.
|
6
6
|
module Reform::Form::ModelReflections
|
7
7
|
def self.included(base)
|
8
|
+
base.extend ClassMethods
|
8
9
|
base.register_feature self # makes it work in nested forms.
|
9
10
|
end
|
10
11
|
|
12
|
+
module ClassMethods
|
13
|
+
# Delegate reflect_on_association to the model class to support simple_form's
|
14
|
+
# association input.
|
15
|
+
def reflect_on_association(*args)
|
16
|
+
model_name.to_s.constantize.reflect_on_association(*args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
11
20
|
# Delegate column for attribute to the model to support simple_form's
|
12
21
|
# attribute type interrogation.
|
13
22
|
def column_for_attribute(name)
|
14
23
|
model_for_property(name).column_for_attribute(name)
|
15
24
|
end
|
16
25
|
|
26
|
+
def has_attribute?(name)
|
27
|
+
model_for_property(name).has_attribute?(name)
|
28
|
+
end
|
29
|
+
|
30
|
+
def defined_enums
|
31
|
+
return model.defined_enums unless is_a?(Reform::Form::Composition)
|
32
|
+
|
33
|
+
model.each.with_object({}) { |m,h| h.merge! m.defined_enums }
|
34
|
+
end
|
35
|
+
|
17
36
|
# this should also contain to_param and friends as this is used by the form helpers.
|
18
37
|
end
|
data/lib/reform/form/sync.rb
CHANGED
@@ -27,11 +27,15 @@ private
|
|
27
27
|
# Transforms form input into what actually gets written to model.
|
28
28
|
# output: {title: "Mint Car", hit: <Form>}
|
29
29
|
def input_representer
|
30
|
-
self.class.representer(:input) do |dfn|
|
31
|
-
dfn
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
self.class.representer(:input, :all => true) do |dfn|
|
31
|
+
if dfn[:form]
|
32
|
+
dfn.merge!(
|
33
|
+
:representable => false,
|
34
|
+
:prepare => lambda { |obj, *| obj },
|
35
|
+
)
|
36
|
+
else
|
37
|
+
dfn.merge!(:render_nil => true) # do sync nil values back to the model for scalars.
|
38
|
+
end
|
35
39
|
end
|
36
40
|
end
|
37
41
|
|
data/lib/reform/version.rb
CHANGED
@@ -16,7 +16,19 @@ class ModelReflectionTest < MiniTest::Spec
|
|
16
16
|
|
17
17
|
module ColumnForAttribute
|
18
18
|
def column_for_attribute(*args)
|
19
|
-
|
19
|
+
"#{self.class}: #{args.inspect}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module HasAttribute
|
24
|
+
def has_attribute?(*args)
|
25
|
+
"#{self.class}: has #{args.inspect}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module DefinedEnums
|
30
|
+
def defined_enums
|
31
|
+
{self.class => []}
|
20
32
|
end
|
21
33
|
end
|
22
34
|
|
@@ -35,6 +47,47 @@ class ModelReflectionTest < MiniTest::Spec
|
|
35
47
|
end
|
36
48
|
end
|
37
49
|
|
50
|
+
describe "#has_attribute?" do
|
51
|
+
let (:artist) { Artist.new }
|
52
|
+
let (:song) { Song.new(artist: artist) }
|
53
|
+
let (:form) { SongForm.new(song) }
|
54
|
+
|
55
|
+
# delegate to model.
|
56
|
+
it do
|
57
|
+
song.extend(HasAttribute)
|
58
|
+
artist.extend(HasAttribute)
|
59
|
+
|
60
|
+
form.has_attribute?(:title).must_equal "Song: has [:title]"
|
61
|
+
form.artist.has_attribute?(:name).must_equal "Artist: has [:name]"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#defined_enums" do
|
66
|
+
let (:artist) { Artist.new }
|
67
|
+
let (:song) { Song.new(artist: artist) }
|
68
|
+
let (:form) { SongForm.new(song) }
|
69
|
+
|
70
|
+
# delegate to model.
|
71
|
+
it do
|
72
|
+
song.extend(DefinedEnums)
|
73
|
+
artist.extend(DefinedEnums)
|
74
|
+
|
75
|
+
form.defined_enums.must_include Song
|
76
|
+
form.artist.defined_enums.must_include Artist
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe ".reflect_on_association" do
|
81
|
+
let (:artist) { Artist.new }
|
82
|
+
let (:song) { Song.new(artist: artist) }
|
83
|
+
let (:form) { SongForm.new(song) }
|
84
|
+
|
85
|
+
# delegate to model class.
|
86
|
+
it do
|
87
|
+
reflection = form.class.reflect_on_association(:artist)
|
88
|
+
reflection.must_be_instance_of ActiveRecord::Reflection::AssociationReflection
|
89
|
+
end
|
90
|
+
end
|
38
91
|
|
39
92
|
class SongWithArtistForm < Reform::Form
|
40
93
|
include Reform::Form::ActiveRecord
|
@@ -62,4 +115,20 @@ class ModelReflectionTest < MiniTest::Spec
|
|
62
115
|
form.column_for_attribute(:title).must_equal "Song: [:title]"
|
63
116
|
end
|
64
117
|
end
|
65
|
-
|
118
|
+
|
119
|
+
describe "#defined_enums with composition" do
|
120
|
+
let (:artist) { Artist.new }
|
121
|
+
let (:song) { Song.new }
|
122
|
+
let (:form) { SongWithArtistForm.new(artist: artist, song: song) }
|
123
|
+
|
124
|
+
# delegates to respective model.
|
125
|
+
it do
|
126
|
+
song.extend(DefinedEnums)
|
127
|
+
artist.extend(DefinedEnums)
|
128
|
+
|
129
|
+
|
130
|
+
form.defined_enums.must_include Song
|
131
|
+
form.defined_enums.must_include Artist
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
data/test/sync_test.rb
CHANGED
@@ -39,4 +39,18 @@ class SyncTest < BaseTest
|
|
39
39
|
it { song2.title.must_equal "Roxanne" }
|
40
40
|
it { label.name.must_equal "Polydor" }
|
41
41
|
end
|
42
|
+
|
43
|
+
describe "with incoming nil value" do
|
44
|
+
it do
|
45
|
+
album = Album.new("GI")
|
46
|
+
form = ErrorsTest::AlbumForm.new(album)
|
47
|
+
|
48
|
+
form.title.must_equal "GI"
|
49
|
+
|
50
|
+
form.validate("title" => nil)
|
51
|
+
form.title.must_equal nil
|
52
|
+
form.sync
|
53
|
+
album.title.must_equal nil
|
54
|
+
end
|
55
|
+
end
|
42
56
|
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: 1.2.
|
4
|
+
version: 1.2.3
|
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: 2014-
|
12
|
+
date: 2014-12-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: representable
|