reform 1.2.2 → 1.2.3
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 +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
|