assignable_values 0.11.1 → 0.11.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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=