assignable_values 0.10.0 → 0.11.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 +15 -0
- data/README.md +8 -4
- data/lib/assignable_values/active_record/restriction/base.rb +14 -7
- data/lib/assignable_values/version.rb +1 -1
- data/spec/rails-3.0/Gemfile.lock +1 -1
- data/spec/rails-3.2/Gemfile.lock +1 -1
- data/spec/rails-4.1/Gemfile.lock +1 -1
- data/spec/rails-4.1/Rakefile +1 -1
- data/spec/shared/assignable_values/active_record_spec.rb +27 -2
- metadata +84 -105
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NmQwMjA2ZmZiMjQyOTRhOWMwNWViYTI4OTg4NTljMWFjMTRhNDUyYg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NDM4YzA1NTk3ZGU2NjNiMmUyNjZiNDI2MWIwYTIxMTdkZTNjZmU1NA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZWFkZTk3NzkyMjk5ZjA3MmM0NDA3ZGQwMDA0ZTc0MDc3NjFjYjgzYzMyNjg2
|
10
|
+
ODQ2YWE1YTI0ZjNhZmQ5NDc2YjNjOTUxMWQ0ZjhjM2U4MzhjMDIxYmI5ZGNk
|
11
|
+
MzM4OWUyMTY5MTIwZGE0YTZmMTRiMjY0MDBlZDkyYjNkMWY3NGI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OGEyZWQ2OTBhN2ZhMTNjNDg3ZTFhNzdmNzcyNDQ1NmIyNTJiZTQwNzEwNmZh
|
14
|
+
ZDdiYTQ2OWFlYTQ2NTYwMzA2ZmNhM2EyNjdjYmRlMzRhMTRhNjQ1OWFkYWZm
|
15
|
+
ZTNlMDViOTNmZmQ4Mjg4ZmE0YzQxYTQ5NTZhNmNmNmE5MzNlOWY=
|
data/README.md
CHANGED
@@ -158,11 +158,15 @@ If a value has been saved before, it will remain valid, even if it is no longer
|
|
158
158
|
|
159
159
|
It will also be returned when obtaining the list of assignable values:
|
160
160
|
|
161
|
-
song.
|
161
|
+
song.assignable_years # => [2010, 2011, 2012, 1985]
|
162
|
+
|
163
|
+
However, if you want only those values that are actually intended to be assignable, e.g. when updating a `<select>` via AJAX, pass an option:
|
164
|
+
|
165
|
+
song.assignable_years(include_stored_value: false) # => [2010, 2011, 2012]
|
162
166
|
|
163
167
|
Once a changed value has been saved, the previous value disappears from the list of assignable values:
|
164
168
|
|
165
|
-
song.
|
169
|
+
song.year = '2010'
|
166
170
|
song.save!
|
167
171
|
song.assignable_years # => [2010, 2011, 2012]
|
168
172
|
song.year = 1985
|
@@ -176,7 +180,7 @@ Restricting belongs_to associations
|
|
176
180
|
|
177
181
|
You can restrict `belongs_to` associations in the same manner as scalar attributes:
|
178
182
|
|
179
|
-
class Song
|
183
|
+
class Song < ActiveRecord::Base
|
180
184
|
|
181
185
|
belongs_to :artist
|
182
186
|
|
@@ -202,7 +206,7 @@ Listing and validating als works the same:
|
|
202
206
|
song.valid? # => false
|
203
207
|
|
204
208
|
Similiar to scalar attributes, associations are only validated when the foreign key (`artist_id` in the example above) changes.
|
205
|
-
|
209
|
+
Values stored in the database will remain assignable until they are changed, and you can query actually assignable values with `song.assignable_artists(include_stored_value: false)`.
|
206
210
|
|
207
211
|
Validation errors will be attached to the association's foreign key (`artist_id` in the example above).
|
208
212
|
|
@@ -45,19 +45,23 @@ module AssignableValues
|
|
45
45
|
assignable_values(record).include?(value)
|
46
46
|
end
|
47
47
|
|
48
|
-
def assignable_values(record,
|
48
|
+
def assignable_values(record, options = {})
|
49
49
|
assignable_values = []
|
50
50
|
parsed_values = parsed_assignable_values(record)
|
51
51
|
current_values = parsed_values.delete(:values)
|
52
|
-
|
53
|
-
if
|
54
|
-
|
52
|
+
|
53
|
+
if options.fetch(:include_old_value, true)
|
54
|
+
old_value = previously_saved_value(record)
|
55
|
+
if old_value.present? && !current_values.include?(old_value)
|
56
|
+
assignable_values << old_value
|
57
|
+
end
|
55
58
|
end
|
59
|
+
|
56
60
|
assignable_values += current_values
|
57
61
|
parsed_values.each do |meta_name, meta_content|
|
58
62
|
assignable_values.singleton_class.send(:define_method, meta_name) { meta_content }
|
59
63
|
end
|
60
|
-
if decorate
|
64
|
+
if options[:decorate]
|
61
65
|
assignable_values = decorate_values(assignable_values)
|
62
66
|
end
|
63
67
|
assignable_values
|
@@ -179,8 +183,11 @@ module AssignableValues
|
|
179
183
|
restriction = self
|
180
184
|
enhance_model do
|
181
185
|
assignable_values_method = "assignable_#{restriction.property.to_s.pluralize}"
|
182
|
-
define_method assignable_values_method do
|
183
|
-
|
186
|
+
define_method assignable_values_method do |*args|
|
187
|
+
# Ruby 1.8.7 does not support optional block arguments :(
|
188
|
+
options = args.first || {}
|
189
|
+
options.merge!({:decorate => true})
|
190
|
+
restriction.assignable_values(self, options)
|
184
191
|
end
|
185
192
|
end
|
186
193
|
end
|
data/spec/rails-3.0/Gemfile.lock
CHANGED
data/spec/rails-3.2/Gemfile.lock
CHANGED
data/spec/rails-4.1/Gemfile.lock
CHANGED
data/spec/rails-4.1/Rakefile
CHANGED
@@ -13,7 +13,7 @@ describe AssignableValues::ActiveRecord do
|
|
13
13
|
end.to raise_error(AssignableValues::NoValuesGiven)
|
14
14
|
end
|
15
15
|
|
16
|
-
context 'when
|
16
|
+
context 'when validating virtual attributes' do
|
17
17
|
|
18
18
|
before :each do
|
19
19
|
@klass = Song.disposable_copy do
|
@@ -71,7 +71,7 @@ describe AssignableValues::ActiveRecord do
|
|
71
71
|
|
72
72
|
it 'should allow a previously saved value even if that value is no longer allowed' do
|
73
73
|
record = @klass.create!(:genre => 'pop')
|
74
|
-
@klass.update_all(:genre => '
|
74
|
+
@klass.update_all(:genre => 'pretend previously valid value') # update without validations for the sake of this test
|
75
75
|
record.reload.should be_valid
|
76
76
|
end
|
77
77
|
|
@@ -516,6 +516,31 @@ describe AssignableValues::ActiveRecord do
|
|
516
516
|
record.assignable_genres.should == %w[pop rock]
|
517
517
|
end
|
518
518
|
|
519
|
+
it 'should allow omitting a previously saved value' do
|
520
|
+
klass = Song.disposable_copy do
|
521
|
+
assignable_values_for :genre do
|
522
|
+
%w[pop rock]
|
523
|
+
end
|
524
|
+
end
|
525
|
+
record = klass.create!(:genre => 'pop')
|
526
|
+
klass.update_all(:genre => 'ballad') # update without validation for the sake of this test
|
527
|
+
record.reload.assignable_genres(:include_old_value => false).should == %w[pop rock]
|
528
|
+
end
|
529
|
+
|
530
|
+
it 'should allow omitting a previously saved association' do
|
531
|
+
allowed_association = Artist.create!
|
532
|
+
disallowed_association = Artist.create!
|
533
|
+
klass = Song.disposable_copy
|
534
|
+
|
535
|
+
record = klass.create!(:artist => disallowed_association)
|
536
|
+
klass.class_eval do
|
537
|
+
assignable_values_for :artist do
|
538
|
+
[allowed_association]
|
539
|
+
end
|
540
|
+
end
|
541
|
+
record.assignable_artists(:include_old_value => false).should =~ [allowed_association]
|
542
|
+
end
|
543
|
+
|
519
544
|
context 'humanization' do
|
520
545
|
|
521
546
|
it 'should define a method that return pairs of values and their humanization' do
|
metadata
CHANGED
@@ -1,104 +1,92 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: assignable_values
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 10
|
9
|
-
- 0
|
10
|
-
version: 0.10.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.11.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Henning Koch
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2014-06-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: activerecord
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 3
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
32
20
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: rails
|
36
21
|
prerelease: false
|
37
|
-
|
38
|
-
|
39
|
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rails
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
40
31
|
- - ~>
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
segments:
|
44
|
-
- 3
|
45
|
-
- 1
|
46
|
-
version: "3.1"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.1'
|
47
34
|
type: :development
|
48
|
-
version_requirements: *id002
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: rspec
|
51
35
|
prerelease: false
|
52
|
-
|
53
|
-
|
54
|
-
requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
55
38
|
- - ~>
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.8'
|
62
48
|
type: :development
|
63
|
-
version_requirements: *id003
|
64
|
-
- !ruby/object:Gem::Dependency
|
65
|
-
name: rspec-rails
|
66
49
|
prerelease: false
|
67
|
-
|
68
|
-
|
69
|
-
requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
70
52
|
- - ~>
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.8'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.8'
|
77
62
|
type: :development
|
78
|
-
version_requirements: *id004
|
79
|
-
- !ruby/object:Gem::Dependency
|
80
|
-
name: sqlite3
|
81
63
|
prerelease: false
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.8'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: sqlite3
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
91
76
|
type: :development
|
92
|
-
|
93
|
-
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Restrict the values assignable to ActiveRecord attributes or associations.
|
84
|
+
Or enums on steroids.
|
94
85
|
email: henning.koch@makandra.de
|
95
86
|
executables: []
|
96
|
-
|
97
87
|
extensions: []
|
98
|
-
|
99
88
|
extra_rdoc_files: []
|
100
|
-
|
101
|
-
files:
|
89
|
+
files:
|
102
90
|
- .gitignore
|
103
91
|
- .rspec
|
104
92
|
- .ruby-version
|
@@ -214,39 +202,31 @@ files:
|
|
214
202
|
- spec/shared/assignable_values/active_record_spec.rb
|
215
203
|
- spec/shared/assignable_values/humanized_value_spec.rb
|
216
204
|
homepage: https://github.com/makandra/assignable_values
|
217
|
-
licenses:
|
205
|
+
licenses:
|
218
206
|
- MIT
|
207
|
+
metadata: {}
|
219
208
|
post_install_message:
|
220
209
|
rdoc_options: []
|
221
|
-
|
222
|
-
require_paths:
|
210
|
+
require_paths:
|
223
211
|
- lib
|
224
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
none: false
|
235
|
-
requirements:
|
236
|
-
- - ">="
|
237
|
-
- !ruby/object:Gem::Version
|
238
|
-
hash: 3
|
239
|
-
segments:
|
240
|
-
- 0
|
241
|
-
version: "0"
|
212
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
213
|
+
requirements:
|
214
|
+
- - ! '>='
|
215
|
+
- !ruby/object:Gem::Version
|
216
|
+
version: '0'
|
217
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
218
|
+
requirements:
|
219
|
+
- - ! '>='
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '0'
|
242
222
|
requirements: []
|
243
|
-
|
244
223
|
rubyforge_project:
|
245
|
-
rubygems_version:
|
224
|
+
rubygems_version: 2.2.1
|
246
225
|
signing_key:
|
247
|
-
specification_version:
|
248
|
-
summary: Restrict the values assignable to ActiveRecord attributes or associations.
|
249
|
-
|
226
|
+
specification_version: 4
|
227
|
+
summary: Restrict the values assignable to ActiveRecord attributes or associations.
|
228
|
+
Or enums on steroids.
|
229
|
+
test_files:
|
250
230
|
- spec/rails-2.3/Gemfile
|
251
231
|
- spec/rails-2.3/Gemfile.lock
|
252
232
|
- spec/rails-2.3/Rakefile
|
@@ -344,4 +324,3 @@ test_files:
|
|
344
324
|
- spec/shared/app_root/db/migrate/003_create_recordings.rb
|
345
325
|
- spec/shared/assignable_values/active_record_spec.rb
|
346
326
|
- spec/shared/assignable_values/humanized_value_spec.rb
|
347
|
-
has_rdoc:
|