assignable_values 0.14.0 → 0.15.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 +4 -4
- data/CHANGELOG.md +9 -2
- data/README.md +12 -5
- data/gemfiles/Gemfile.2.3.lock +1 -1
- data/gemfiles/Gemfile.3.2.lock +1 -1
- data/gemfiles/Gemfile.4.2.lock +1 -1
- data/gemfiles/Gemfile.5.0.lock +1 -1
- data/gemfiles/Gemfile.5.1.lock +1 -1
- data/gemfiles/Gemfile.5.1.pg.lock +1 -1
- data/lib/assignable_values.rb +1 -0
- data/lib/assignable_values/active_record/restriction/scalar_attribute.rb +18 -6
- data/lib/assignable_values/humanizable_string.rb +2 -1
- data/lib/assignable_values/version.rb +1 -1
- data/spec/assignable_values/active_record_spec.rb +38 -13
- data/spec/support/i18n.yml +3 -0
- data/spec/support/models.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0359f423877ba1c7d9b303053434f7d80077da0cf314a964b6577f31b97fd01
|
4
|
+
data.tar.gz: e3818b1b35b173d4db2a896092a7cf0ee7f8d93381631cd1cfbbf62f64fc6783
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 479c5751e8086031feadcc70a06b878d04020f5fc023b69afd790c2a684f219d56e6d44abfa31387aa342a5c08b4ecfdcea6da085bc9060685ac04750fef3fba
|
7
|
+
data.tar.gz: c38e04dc6003f5f3ab055eeb2b4a9183351c4a7101da42750bd381263e190cdbca0e9638c5e44a88e6510f6aa741eac1612285b1bbfb5347dbb599fdefa95388
|
data/CHANGELOG.md
CHANGED
@@ -6,11 +6,18 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
|
|
6
6
|
|
7
7
|
### Breaking changes
|
8
8
|
|
9
|
-
|
9
|
+
### Compatible changes
|
10
|
+
|
11
|
+
|
12
|
+
## 0.15.0 - 2018-10-26
|
13
|
+
|
14
|
+
### Breaking changes
|
15
|
+
|
16
|
+
- `#humanized_values` is deprecated, in favour of `#humanized_assignablevalues`
|
10
17
|
|
11
18
|
### Compatible changes
|
12
19
|
|
13
|
-
-
|
20
|
+
- `#humanized_value(value)` and `#humanized_assignable_values` now also works for the `multiple: true` case
|
14
21
|
|
15
22
|
|
16
23
|
## 0.14.0 - 2018-09-17
|
data/README.md
CHANGED
@@ -65,13 +65,13 @@ Or you can retrieve the humanized version of any given value by passing it as an
|
|
65
65
|
|
66
66
|
You can obtain a list of all assignable values with their humanizations:
|
67
67
|
|
68
|
-
song.
|
69
|
-
song.
|
70
|
-
song.
|
68
|
+
song.humanized_assignable_genres.size # => 3
|
69
|
+
song.humanized_assignable_genres.first.value # => "pop"
|
70
|
+
song.humanized_assignable_genres.first.humanized # => "Pop music"
|
71
71
|
|
72
72
|
A good way to populate a `<select>` tag with pairs of internal values and human labels is to use the `collection_select` helper from Rails:
|
73
73
|
|
74
|
-
form.collection_select :genre, form.object.
|
74
|
+
form.collection_select :genre, form.object.humanized_assignable_genres, :value, :humanized
|
75
75
|
|
76
76
|
|
77
77
|
### Defining default values
|
@@ -166,7 +166,7 @@ This is to prevent records from becoming invalid as the list of assignable value
|
|
166
166
|
|
167
167
|
### Array values
|
168
168
|
|
169
|
-
Assignable values can also be used for array values. This works when you use Rails 5+ and PostgreSQL with an array column, or
|
169
|
+
Assignable values can also be used for array values. This works when you use Rails 5+ and PostgreSQL with an array column, or on older Rails versions and other databases using ActiveRecord's `serialize`.
|
170
170
|
|
171
171
|
To validate array values, pass `multiple: true`:
|
172
172
|
|
@@ -182,6 +182,13 @@ end
|
|
182
182
|
|
183
183
|
In this case, every *subset* of the given values is valid, for example `['pop', 'electronic']`.
|
184
184
|
|
185
|
+
For humanization, you can still use
|
186
|
+
|
187
|
+
```
|
188
|
+
song.humanizable_genre('pop') # => "Pop music"
|
189
|
+
song.assignable_humanizable_genres.last.humanized # => "Electronic music"
|
190
|
+
```
|
191
|
+
|
185
192
|
|
186
193
|
Restricting belongs_to associations
|
187
194
|
-----------------------------------
|
data/gemfiles/Gemfile.2.3.lock
CHANGED
data/gemfiles/Gemfile.3.2.lock
CHANGED
data/gemfiles/Gemfile.4.2.lock
CHANGED
data/gemfiles/Gemfile.5.0.lock
CHANGED
data/gemfiles/Gemfile.5.1.lock
CHANGED
data/lib/assignable_values.rb
CHANGED
@@ -7,7 +7,7 @@ module AssignableValues
|
|
7
7
|
super
|
8
8
|
define_humanized_value_instance_method
|
9
9
|
define_humanized_value_class_method
|
10
|
-
|
10
|
+
define_humanized_assignable_values_instance_method
|
11
11
|
end
|
12
12
|
|
13
13
|
def humanized_value(value)
|
@@ -17,7 +17,7 @@ module AssignableValues
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def humanized_assignable_values(record)
|
21
21
|
values = assignable_values(record)
|
22
22
|
values.collect do |value|
|
23
23
|
HumanizedValue.new(value, humanized_value(value))
|
@@ -45,8 +45,12 @@ module AssignableValues
|
|
45
45
|
|
46
46
|
def define_humanized_value_instance_method
|
47
47
|
restriction = self
|
48
|
+
multiple = @options[:multiple]
|
48
49
|
enhance_model do
|
49
|
-
define_method :"humanized_#{restriction.property}" do |*args|
|
50
|
+
define_method :"humanized_#{restriction.property.to_s.singularize}" do |*args|
|
51
|
+
if args.size > 1 || (multiple && args.size == 0)
|
52
|
+
raise ArgumentError.new("wrong number of arguments (#{args.size} for #{multiple ? '1' : '0..1'})")
|
53
|
+
end
|
50
54
|
given_value = args[0]
|
51
55
|
value = given_value || send(restriction.property)
|
52
56
|
restriction.humanized_value(value)
|
@@ -54,11 +58,19 @@ module AssignableValues
|
|
54
58
|
end
|
55
59
|
end
|
56
60
|
|
57
|
-
def
|
61
|
+
def define_humanized_assignable_values_instance_method
|
58
62
|
restriction = self
|
63
|
+
multiple = @options[:multiple]
|
59
64
|
enhance_model do
|
60
|
-
define_method :"
|
61
|
-
restriction.
|
65
|
+
define_method :"humanized_assignable_#{restriction.property.to_s.pluralize}" do
|
66
|
+
restriction.humanized_assignable_values(self)
|
67
|
+
end
|
68
|
+
|
69
|
+
unless multiple
|
70
|
+
define_method :"humanized_#{restriction.property.to_s.pluralize}" do
|
71
|
+
ActiveSupport::Deprecation.warn("humanized_<value>s is deprecated, use humanized_assignable_<value>s instead", caller)
|
72
|
+
restriction.humanized_assignable_values(self)
|
73
|
+
end
|
62
74
|
end
|
63
75
|
end
|
64
76
|
end
|
@@ -20,6 +20,10 @@ describe AssignableValues::ActiveRecord do
|
|
20
20
|
assignable_values_for :sub_genre do
|
21
21
|
%w[pop rock]
|
22
22
|
end
|
23
|
+
|
24
|
+
assignable_values_for :multi_genres, :allow_blank => true do
|
25
|
+
%w[pop rock]
|
26
|
+
end
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
@@ -35,6 +39,8 @@ describe AssignableValues::ActiveRecord do
|
|
35
39
|
it 'should generate a method returning the humanized value' do
|
36
40
|
song = @klass.new(:sub_genre => 'pop')
|
37
41
|
song.humanized_sub_genre.should == 'Pop music'
|
42
|
+
song.humanized_sub_genre('rock').should == 'Rock music'
|
43
|
+
song.humanized_multi_genre('rock').should == 'Rock music'
|
38
44
|
end
|
39
45
|
|
40
46
|
end
|
@@ -45,21 +51,21 @@ describe AssignableValues::ActiveRecord do
|
|
45
51
|
|
46
52
|
before :each do
|
47
53
|
@klass = Song.disposable_copy do
|
48
|
-
assignable_values_for :
|
54
|
+
assignable_values_for :multi_genres, :multiple => true do
|
49
55
|
%w[pop rock]
|
50
56
|
end
|
51
57
|
end
|
52
58
|
end
|
53
59
|
|
54
60
|
it 'should validate that the attribute is a subset' do
|
55
|
-
@klass.new(:
|
56
|
-
@klass.new(:
|
57
|
-
@klass.new(:
|
61
|
+
@klass.new(:multi_genres => ['pop']).should be_valid
|
62
|
+
@klass.new(:multi_genres => ['pop', 'rock']).should be_valid
|
63
|
+
@klass.new(:multi_genres => ['pop', 'disallowed value']).should_not be_valid
|
58
64
|
end
|
59
65
|
|
60
66
|
it 'should not allow nil or [] for allow_blank: false' do
|
61
|
-
@klass.new(:
|
62
|
-
@klass.new(:
|
67
|
+
@klass.new(:multi_genres => nil).should_not be_valid
|
68
|
+
@klass.new(:multi_genres => []).should_not be_valid
|
63
69
|
end
|
64
70
|
|
65
71
|
end
|
@@ -68,15 +74,15 @@ describe AssignableValues::ActiveRecord do
|
|
68
74
|
|
69
75
|
before :each do
|
70
76
|
@klass = Song.disposable_copy do
|
71
|
-
assignable_values_for :
|
77
|
+
assignable_values_for :multi_genres, :multiple => true, :allow_blank => true do
|
72
78
|
%w[pop rock]
|
73
79
|
end
|
74
80
|
end
|
75
81
|
end
|
76
82
|
|
77
83
|
it 'should allow nil or [] for allow_blank: false' do
|
78
|
-
@klass.new(:
|
79
|
-
@klass.new(:
|
84
|
+
@klass.new(:multi_genres => nil).should be_valid
|
85
|
+
@klass.new(:multi_genres => []).should be_valid
|
80
86
|
end
|
81
87
|
|
82
88
|
end
|
@@ -791,11 +797,18 @@ describe AssignableValues::ActiveRecord do
|
|
791
797
|
assignable_values_for :genre do
|
792
798
|
%w[pop rock]
|
793
799
|
end
|
800
|
+
|
801
|
+
assignable_values_for :multi_genres, :multiple => true do
|
802
|
+
%w[pop rock]
|
803
|
+
end
|
794
804
|
end
|
795
|
-
genres = klass.new.
|
805
|
+
genres = klass.new.humanized_assignable_genres
|
796
806
|
genres.collect(&:value).should == ['pop', 'rock']
|
797
807
|
genres.collect(&:humanized).should == ['Pop music', 'Rock music']
|
798
808
|
genres.collect(&:to_s).should == ['Pop music', 'Rock music']
|
809
|
+
|
810
|
+
multi_genres = klass.new.humanized_assignable_multi_genres
|
811
|
+
multi_genres.collect(&:humanized).should == ['Pop music', 'Rock music']
|
799
812
|
end
|
800
813
|
|
801
814
|
it 'should use String#humanize as a default translation' do
|
@@ -804,7 +817,7 @@ describe AssignableValues::ActiveRecord do
|
|
804
817
|
%w[electronic]
|
805
818
|
end
|
806
819
|
end
|
807
|
-
klass.new.
|
820
|
+
klass.new.humanized_assignable_genres.collect(&:humanized).should == ['Electronic']
|
808
821
|
end
|
809
822
|
|
810
823
|
it 'should allow to define humanizations for values that are not strings' do
|
@@ -813,7 +826,7 @@ describe AssignableValues::ActiveRecord do
|
|
813
826
|
[1977, 1980, 1983]
|
814
827
|
end
|
815
828
|
end
|
816
|
-
years = klass.new.
|
829
|
+
years = klass.new.humanized_assignable_years
|
817
830
|
years.collect(&:value).should == [1977, 1980, 1983]
|
818
831
|
years.collect(&:humanized).should == ['The year a new hope was born', 'The year the Empire stroke back', 'The year the Jedi returned']
|
819
832
|
end
|
@@ -824,18 +837,30 @@ describe AssignableValues::ActiveRecord do
|
|
824
837
|
[1977, 1980, 1983]
|
825
838
|
end
|
826
839
|
end
|
827
|
-
years = klass.new.
|
840
|
+
years = klass.new.humanized_assignable_years
|
828
841
|
years.collect(&:humanized).should == ['The year a new hope was born', 'The year the Empire stroke back', 'The year the Jedi returned']
|
829
842
|
end
|
830
843
|
|
831
844
|
context 'legacy methods for API compatibility' do
|
832
845
|
|
846
|
+
it 'should define a method that return pairs of values and their humanization' do
|
847
|
+
klass = Song.disposable_copy do
|
848
|
+
assignable_values_for :genre do
|
849
|
+
%w[pop rock]
|
850
|
+
end
|
851
|
+
end
|
852
|
+
ActiveSupport::Deprecation.should_receive(:warn)
|
853
|
+
genres = klass.new.humanized_genres
|
854
|
+
genres.collect(&:humanized).should == ['Pop music', 'Rock music']
|
855
|
+
end
|
856
|
+
|
833
857
|
it "should define a method #humanized on assignable string values, which return up the value's' translation" do
|
834
858
|
klass = Song.disposable_copy do
|
835
859
|
assignable_values_for :genre do
|
836
860
|
%w[pop rock]
|
837
861
|
end
|
838
862
|
end
|
863
|
+
ActiveSupport::Deprecation.should_receive(:warn).at_least(:once)
|
839
864
|
klass.new.assignable_genres.collect(&:humanized).should == ['Pop music', 'Rock music']
|
840
865
|
end
|
841
866
|
|
data/spec/support/i18n.yml
CHANGED
data/spec/support/models.rb
CHANGED
@@ -8,7 +8,7 @@ class Song < ActiveRecord::Base
|
|
8
8
|
|
9
9
|
belongs_to :artist
|
10
10
|
|
11
|
-
attr_accessor :sub_genre, :sub_genres
|
11
|
+
attr_accessor :sub_genre, :sub_genres, :multi_genres
|
12
12
|
|
13
13
|
if ActiveRecord::VERSION::MAJOR < 4 || !Song.new(:genres => ['test']).genres.is_a?(Array)
|
14
14
|
# Rails 4 or not postgres
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: assignable_values
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henning Koch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -90,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
90
|
version: '0'
|
91
91
|
requirements: []
|
92
92
|
rubyforge_project:
|
93
|
-
rubygems_version: 2.7.
|
93
|
+
rubygems_version: 2.7.7
|
94
94
|
signing_key:
|
95
95
|
specification_version: 4
|
96
96
|
summary: Restrict the values assignable to ActiveRecord attributes or associations
|