assignable_values 0.11.1 → 0.11.2

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.
@@ -50,9 +50,9 @@ module AssignableValues
50
50
  parsed_values = parsed_assignable_values(record)
51
51
  current_values = parsed_values.delete(:values)
52
52
 
53
- if options.fetch(:include_old_value, true)
53
+ if options.fetch(:include_old_value, true) && has_previously_saved_value?(record)
54
54
  old_value = previously_saved_value(record)
55
- if old_value.present? && !current_values.include?(old_value)
55
+ unless current_values.include?(old_value)
56
56
  assignable_values << old_value
57
57
  end
58
58
  end
@@ -103,8 +103,12 @@ module AssignableValues
103
103
  record.send(property)
104
104
  end
105
105
 
106
+ def has_previously_saved_value?(record)
107
+ raise NotImplementedError
108
+ end
109
+
106
110
  def previously_saved_value(record)
107
- nil
111
+ raise NotImplementedError
108
112
  end
109
113
 
110
114
  def decorate_values(values)
@@ -26,8 +26,12 @@ module AssignableValues
26
26
  record.send(association_id_method)
27
27
  end
28
28
 
29
+ def has_previously_saved_value?(record)
30
+ !record.new_record? && record.respond_to?(value_was_method)
31
+ end
32
+
29
33
  def previously_saved_value(record)
30
- if old_id = record.send("#{association_id_method}_was")
34
+ if old_id = record.send(value_was_method).presence
31
35
  if old_id == association_id(record)
32
36
  current_value(record) # no need to query the database if nothing changed
33
37
  else
@@ -42,6 +46,12 @@ module AssignableValues
42
46
  value
43
47
  end
44
48
 
49
+ private
50
+
51
+ def value_was_method
52
+ "#{association_id_method}_was"
53
+ end
54
+
45
55
  end
46
56
  end
47
57
  end
@@ -88,11 +88,18 @@ module AssignableValues
88
88
  end
89
89
  end
90
90
 
91
+ def has_previously_saved_value?(record)
92
+ !record.new_record? && record.respond_to?(value_was_method)
93
+ end
94
+
91
95
  def previously_saved_value(record)
92
- was_method_name = "#{property}_was"
93
- if record.respond_to?(was_method_name)
94
- record.send(was_method_name)
95
- end
96
+ record.send(value_was_method)
97
+ end
98
+
99
+ private
100
+
101
+ def value_was_method
102
+ "#{property}_was"
96
103
  end
97
104
 
98
105
  end
@@ -1,3 +1,3 @@
1
1
  module AssignableValues
2
- VERSION = '0.11.1'
2
+ VERSION = '0.11.2'
3
3
  end
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_WITHOUT: development
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- assignable_values (0.10.0)
4
+ assignable_values (0.11.1)
5
5
  activerecord
6
6
 
7
7
  GEM
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_WITHOUT: development
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- assignable_values (0.11.0)
4
+ assignable_values (0.11.1)
5
5
  activerecord
6
6
 
7
7
  GEM
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_WITHOUT: development
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- assignable_values (0.11.0)
4
+ assignable_values (0.11.1)
5
5
  activerecord
6
6
 
7
7
  GEM
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_WITHOUT: development
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- assignable_values (0.11.0)
4
+ assignable_values (0.11.1)
5
5
  activerecord
6
6
 
7
7
  GEM
@@ -75,6 +75,18 @@ describe AssignableValues::ActiveRecord do
75
75
  record.reload.should be_valid
76
76
  end
77
77
 
78
+ it 'should allow a previously saved, blank value even if that value is no longer allowed' do
79
+ record = @klass.create!(:genre => 'pop')
80
+ @klass.update_all(:genre => '') # update without validations for the sake of this test
81
+ record.reload.should be_valid
82
+ end
83
+
84
+ it 'should not allow nil (the "previous value") if the record was never saved' do
85
+ record = @klass.new(:genre => nil)
86
+ # Show that nil is not assignable, even though `record.genre_was` is nil.
87
+ record.should_not be_valid
88
+ end
89
+
78
90
  it 'should generate a method returning the humanized value' do
79
91
  song = @klass.new(:genre => 'pop')
80
92
  song.humanized_genre.should == 'Pop music'
@@ -235,7 +247,7 @@ describe AssignableValues::ActiveRecord do
235
247
  record.should be_valid
236
248
  end
237
249
 
238
- it 'should allow a previously saved association even if that association is no longer allowed' do
250
+ it 'should allow a previously saved association, even if that association is no longer allowed' do
239
251
  allowed_association = Artist.create!
240
252
  disallowed_association = Artist.create!
241
253
  klass = Song.disposable_copy
@@ -248,6 +260,30 @@ describe AssignableValues::ActiveRecord do
248
260
  record.should be_valid
249
261
  end
250
262
 
263
+ it 'should allow nil for an association if the record was saved before with a nil association' do
264
+ allowed_association = Artist.create!
265
+ klass = Song.disposable_copy
266
+ record = klass.create!(:artist => nil)
267
+ klass.class_eval do
268
+ assignable_values_for :artist do
269
+ [allowed_association]
270
+ end
271
+ end
272
+ record.should be_valid
273
+ end
274
+
275
+ it 'sould not allow nil for an association (the "previously saved value") if the record is new' do
276
+ allowed_association = Artist.create!
277
+ klass = Song.disposable_copy
278
+ record = klass.new(:artist => nil)
279
+ klass.class_eval do
280
+ assignable_values_for :artist do
281
+ [allowed_association]
282
+ end
283
+ end
284
+ record.should_not be_valid
285
+ end
286
+
251
287
  it "should not load a previously saved association if the association's foreign key hasn't changed" do
252
288
  association = Artist.create!
253
289
  klass = Song.disposable_copy do
@@ -516,7 +552,29 @@ describe AssignableValues::ActiveRecord do
516
552
  record.assignable_genres.should == %w[pop rock]
517
553
  end
518
554
 
519
- it 'should allow omitting a previously saved value' do
555
+ it 'should prepend a previously saved blank value to the top of the list, even if is no longer allowed' do
556
+ klass = Song.disposable_copy do
557
+ assignable_values_for :genre do
558
+ %w[pop rock]
559
+ end
560
+ end
561
+ record = klass.create!(:genre => 'pop')
562
+ klass.update_all(:genre => '') # update without validation for the sake of this test
563
+ record.reload.assignable_genres.should == ['', 'pop', 'rock']
564
+ end
565
+
566
+ it 'should not prepend nil to the top of the list if the record was never saved' do
567
+ klass = Song.disposable_copy do
568
+ assignable_values_for :genre do
569
+ %w[pop rock]
570
+ end
571
+ end
572
+ record = klass.new(:genre => 'pop')
573
+ record.genre_was.should be_nil
574
+ record.assignable_genres.should == ['pop', 'rock']
575
+ end
576
+
577
+ it 'should allow omitting a previously saved value with :include_old_value => false option' do
520
578
  klass = Song.disposable_copy do
521
579
  assignable_values_for :genre do
522
580
  %w[pop rock]
metadata CHANGED
@@ -1,92 +1,105 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: assignable_values
3
- version: !ruby/object:Gem::Version
4
- version: 0.11.1
3
+ version: !ruby/object:Gem::Version
4
+ hash: 55
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 11
9
+ - 2
10
+ version: 0.11.2
5
11
  platform: ruby
6
- authors:
12
+ authors:
7
13
  - Henning Koch
8
14
  autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
- date: 2014-06-16 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2015-09-24 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
14
22
  name: activerecord
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ! '>='
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
23
  prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ! '>='
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
28
36
  name: rails
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ~>
32
- - !ruby/object:Gem::Version
33
- version: '3.1'
34
- type: :development
35
37
  prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
38
41
  - - ~>
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'
42
+ - !ruby/object:Gem::Version
43
+ hash: 5
44
+ segments:
45
+ - 3
46
+ - 1
47
+ version: "3.1"
48
48
  type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rspec
49
52
  prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
52
56
  - - ~>
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'
57
+ - !ruby/object:Gem::Version
58
+ hash: 19
59
+ segments:
60
+ - 2
61
+ - 8
62
+ version: "2.8"
62
63
  type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: rspec-rails
63
67
  prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
66
71
  - - ~>
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'
72
+ - !ruby/object:Gem::Version
73
+ hash: 19
74
+ segments:
75
+ - 2
76
+ - 8
77
+ version: "2.8"
76
78
  type: :development
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: sqlite3
77
82
  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.
83
+ requirement: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
91
+ version: "0"
92
+ type: :development
93
+ version_requirements: *id005
94
+ description: Restrict the values assignable to ActiveRecord attributes or associations. Or enums on steroids.
85
95
  email: henning.koch@makandra.de
86
96
  executables: []
97
+
87
98
  extensions: []
99
+
88
100
  extra_rdoc_files: []
89
- files:
101
+
102
+ files:
90
103
  - .gitignore
91
104
  - .rspec
92
105
  - .ruby-version
@@ -104,6 +117,7 @@ files:
104
117
  - lib/assignable_values/humanizable_string.rb
105
118
  - lib/assignable_values/humanized_value.rb
106
119
  - lib/assignable_values/version.rb
120
+ - spec/rails-2.3/.bundle/config
107
121
  - spec/rails-2.3/Gemfile
108
122
  - spec/rails-2.3/Gemfile.lock
109
123
  - spec/rails-2.3/Rakefile
@@ -119,6 +133,7 @@ files:
119
133
  - spec/rails-2.3/rcov.opts
120
134
  - spec/rails-2.3/spec.opts
121
135
  - spec/rails-2.3/spec/spec_helper.rb
136
+ - spec/rails-3.0/.bundle/config
122
137
  - spec/rails-3.0/.rspec
123
138
  - spec/rails-3.0/Gemfile
124
139
  - spec/rails-3.0/Gemfile.lock
@@ -140,6 +155,7 @@ files:
140
155
  - spec/rails-3.0/app_root/script/rails
141
156
  - spec/rails-3.0/rcov.opts
142
157
  - spec/rails-3.0/spec/spec_helper.rb
158
+ - spec/rails-3.2/.bundle/config
143
159
  - spec/rails-3.2/.rspec
144
160
  - spec/rails-3.2/Gemfile
145
161
  - spec/rails-3.2/Gemfile.lock
@@ -161,6 +177,7 @@ files:
161
177
  - spec/rails-3.2/app_root/script/rails
162
178
  - spec/rails-3.2/rcov.opts
163
179
  - spec/rails-3.2/spec/spec_helper.rb
180
+ - spec/rails-4.1/.bundle/config
164
181
  - spec/rails-4.1/.rspec
165
182
  - spec/rails-4.1/.ruby-version
166
183
  - spec/rails-4.1/Gemfile
@@ -201,32 +218,42 @@ files:
201
218
  - spec/shared/app_root/db/migrate/003_create_recordings.rb
202
219
  - spec/shared/assignable_values/active_record_spec.rb
203
220
  - spec/shared/assignable_values/humanized_value_spec.rb
221
+ has_rdoc: true
204
222
  homepage: https://github.com/makandra/assignable_values
205
- licenses:
223
+ licenses:
206
224
  - MIT
207
- metadata: {}
208
225
  post_install_message:
209
226
  rdoc_options: []
210
- require_paths:
227
+
228
+ require_paths:
211
229
  - lib
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'
230
+ required_ruby_version: !ruby/object:Gem::Requirement
231
+ none: false
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ hash: 3
236
+ segments:
237
+ - 0
238
+ version: "0"
239
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
+ none: false
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ hash: 3
245
+ segments:
246
+ - 0
247
+ version: "0"
222
248
  requirements: []
249
+
223
250
  rubyforge_project:
224
- rubygems_version: 2.2.1
251
+ rubygems_version: 1.3.9.5
225
252
  signing_key:
226
- specification_version: 4
227
- summary: Restrict the values assignable to ActiveRecord attributes or associations.
228
- Or enums on steroids.
229
- test_files:
253
+ specification_version: 3
254
+ summary: Restrict the values assignable to ActiveRecord attributes or associations. Or enums on steroids.
255
+ test_files:
256
+ - spec/rails-2.3/.bundle/config
230
257
  - spec/rails-2.3/Gemfile
231
258
  - spec/rails-2.3/Gemfile.lock
232
259
  - spec/rails-2.3/Rakefile
@@ -242,6 +269,7 @@ test_files:
242
269
  - spec/rails-2.3/rcov.opts
243
270
  - spec/rails-2.3/spec.opts
244
271
  - spec/rails-2.3/spec/spec_helper.rb
272
+ - spec/rails-3.0/.bundle/config
245
273
  - spec/rails-3.0/.rspec
246
274
  - spec/rails-3.0/Gemfile
247
275
  - spec/rails-3.0/Gemfile.lock
@@ -263,6 +291,7 @@ test_files:
263
291
  - spec/rails-3.0/app_root/script/rails
264
292
  - spec/rails-3.0/rcov.opts
265
293
  - spec/rails-3.0/spec/spec_helper.rb
294
+ - spec/rails-3.2/.bundle/config
266
295
  - spec/rails-3.2/.rspec
267
296
  - spec/rails-3.2/Gemfile
268
297
  - spec/rails-3.2/Gemfile.lock
@@ -284,6 +313,7 @@ test_files:
284
313
  - spec/rails-3.2/app_root/script/rails
285
314
  - spec/rails-3.2/rcov.opts
286
315
  - spec/rails-3.2/spec/spec_helper.rb
316
+ - spec/rails-4.1/.bundle/config
287
317
  - spec/rails-4.1/.rspec
288
318
  - spec/rails-4.1/.ruby-version
289
319
  - spec/rails-4.1/Gemfile
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NDE4NmE4ZGNlYWVkMDFjYWVkYzYyNTlhNTQ5NGQ3NGFhOTZkYzg5ZA==
5
- data.tar.gz: !binary |-
6
- MGU2OGRjNjliYTM2ZjU0ODY5MzljY2ZiMWYwY2ViN2FjMDViM2QyNQ==
7
- SHA512:
8
- metadata.gz: !binary |-
9
- NWJkZjEyYzhmNGZiZWJiYjZmMTAwZTJhYmY0NjU4ZjVlZjFhMTBkYTQ0NDc5
10
- ZTZlNTU3Y2Y3NWNjZmU3YWE4YjQ2MDBhNGQ4Nzg1NmYyN2ZmYzhkN2UxMGEy
11
- MTUwYmYzM2I5YTcwYmYxMzUxZDk3NjU2MjczZjlkZTRmMTBkYmY=
12
- data.tar.gz: !binary |-
13
- MGFmZDgzMmUzZjZiMzdkOTlmNTg4ZjdiN2QxNTY5ODk0ZGQ4NzFhMDA4ZDZh
14
- MzEyODllMjFjMDgzZTc5NDMzYzg3M2U0NzkyMTQ4ZTk4OGUzZjM5NzNmYTMz
15
- MDkxYjI2NDUwN2M1Njg1ZjQyYzRhOTRmYmYyOGZhYTEyMmQ5MDY=