assignable_values 0.1.0 → 0.1.1

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.
data/README.md CHANGED
@@ -48,7 +48,7 @@ This is useful for populating <select> tags in web forms:
48
48
 
49
49
  form.select :genre, form.object.assignable_genres
50
50
 
51
- ### Human labels
51
+ ### Humanized labels
52
52
 
53
53
  You will often want to present internal values in a humanized form. E.g. `"pop"` should be presented as `"Pop music"`.
54
54
 
@@ -64,12 +64,12 @@ You can define human labels in your I18n dictionary:
64
64
 
65
65
  When obtaining a list of assignable values, each value will have a method `#human` that returns the translation:
66
66
 
67
- song.assignable_genres.first # => 'pop'
68
- song.assignable_genres.first.human # => 'Pop music'
67
+ song.assignable_genres.first # => 'pop'
68
+ song.assignable_genres.first.humanized # => 'Pop music'
69
69
 
70
70
  You can populate a <select> tag with pairs of internal values and human labels like this:
71
71
 
72
- form.collection_select :genre, form.object.assignable_genres, :to_s, :human
72
+ form.collection_select :genre, form.object.assignable_genres, :to_s, :humanized
73
73
 
74
74
  ## Restricting belongs_to associations
75
75
 
@@ -46,10 +46,6 @@ module AssignableValues
46
46
  true
47
47
  end
48
48
 
49
- def humanize_string_value(value)
50
- I18n.t("assignable_values.#{model.name.underscore}.#{property}.#{value}", :default => value.humanize)
51
- end
52
-
53
49
  private
54
50
 
55
51
  def current_value(record)
@@ -3,14 +3,36 @@ module AssignableValues
3
3
  module Restriction
4
4
  class ScalarAttribute < Base
5
5
 
6
+ def initialize(*args)
7
+ super
8
+ define_humanized_method
9
+ end
10
+
11
+ def humanize_string_value(value)
12
+ if value.present?
13
+ dictionary_key = "assignable_values.#{model.name.underscore}.#{property}.#{value}"
14
+ I18n.t(dictionary_key, :default => value.humanize)
15
+ end
16
+ end
17
+
6
18
  private
7
19
 
20
+ def define_humanized_method
21
+ restriction = self
22
+ enhance_model do
23
+ define_method "humanized_#{restriction.property}" do
24
+ value = send(restriction.property)
25
+ restriction.humanize_string_value(value)
26
+ end
27
+ end
28
+ end
29
+
8
30
  def decorate_values(values)
9
31
  restriction = self
10
32
  values.collect do |value|
11
33
  if value.is_a?(String)
12
34
  value = value.dup
13
- value.singleton_class.send(:define_method, :human) do
35
+ value.singleton_class.send(:define_method, :humanized) do
14
36
  restriction.humanize_string_value(value)
15
37
  end
16
38
  end
@@ -22,6 +44,7 @@ module AssignableValues
22
44
  record.send("#{property}_was")
23
45
  end
24
46
 
47
+
25
48
  end
26
49
  end
27
50
  end
@@ -1,3 +1,3 @@
1
1
  module AssignableValues
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -57,6 +57,19 @@ describe AssignableValues::ActiveRecord do
57
57
  song.should be_valid
58
58
  end
59
59
 
60
+ it 'should generate a method returning the humanized value' do
61
+ song = @klass.new(:genre => 'pop')
62
+ song.humanized_genre.should == 'Pop music'
63
+ end
64
+
65
+ it 'should generate a method returning the humanized value, which is nil when the value is blank' do
66
+ song = @klass.new
67
+ song.genre = nil
68
+ song.humanized_genre.should be_nil
69
+ song.genre = ''
70
+ song.humanized_genre.should be_nil
71
+ end
72
+
60
73
  end
61
74
 
62
75
  context 'if the :allow_blank option is set' do
@@ -253,13 +266,13 @@ describe AssignableValues::ActiveRecord do
253
266
  @klass.new.assignable_genres.should == %w[pop rock]
254
267
  end
255
268
 
256
- it "should define a method #human on strings in that list, which return up the value's' translation" do
269
+ it "should define a method #humanized on strings in that list, which return up the value's' translation" do
257
270
  @klass = disposable_song_class do
258
271
  assignable_values_for :genre do
259
272
  %w[pop rock]
260
273
  end
261
274
  end
262
- @klass.new.assignable_genres.collect(&:human).should == ['Pop music', 'Rock music']
275
+ @klass.new.assignable_genres.collect(&:humanized).should == ['Pop music', 'Rock music']
263
276
  end
264
277
 
265
278
  it 'should use String#humanize as a default translation' do
@@ -268,10 +281,10 @@ describe AssignableValues::ActiveRecord do
268
281
  %w[electronic]
269
282
  end
270
283
  end
271
- @klass.new.assignable_genres.collect(&:human).should == ['Electronic']
284
+ @klass.new.assignable_genres.collect(&:humanized).should == ['Electronic']
272
285
  end
273
286
 
274
- it 'should not define a method #human on values that are not strings' do
287
+ it 'should not define a method #humanized on values that are not strings' do
275
288
  @klass = disposable_song_class do
276
289
  assignable_values_for :year do
277
290
  [1999, 2000, 2001]
@@ -279,7 +292,7 @@ describe AssignableValues::ActiveRecord do
279
292
  end
280
293
  years = @klass.new.assignable_years
281
294
  years.should == [1999, 2000, 2001]
282
- years.first.should_not respond_to(:human)
295
+ years.first.should_not respond_to(:humanized)
283
296
  end
284
297
 
285
298
  it 'should call #to_a on the list of assignable values, allowing ranges and scopes to be passed as allowed value descriptors' do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assignable_values
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Henning Koch