enumerize 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/README.md +2 -0
- data/lib/enumerize.rb +7 -0
- data/lib/enumerize/activerecord.rb +0 -24
- data/lib/enumerize/attribute.rb +11 -0
- data/lib/enumerize/base.rb +12 -2
- data/lib/enumerize/scope/activerecord.rb +37 -0
- data/lib/enumerize/scope/mongoid.rb +40 -0
- data/lib/enumerize/value.rb +5 -1
- data/lib/enumerize/version.rb +1 -1
- data/test/activerecord_test.rb +6 -0
- data/test/attribute_test.rb +12 -0
- data/test/mongoid_test.rb +26 -2
- data/test/multiple_test.rb +6 -0
- data/test/value_test.rb +18 -3
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 964f689869d7570459451bae1068a737f69a7db2
|
4
|
+
data.tar.gz: b1c59894d98bd2656d01c5bca52f4dc15a7fa42a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61ca5ff5fcaac6dd6a38622fbf2af35f74896bf57f9f317cbc2b7b918814ab9b4aa5e9a6437de14b709a72b61d2d09c04c7d86a6504335faed7fd008c21b2051
|
7
|
+
data.tar.gz: 8a5e9bb95f72b0abbdd5619ace2299ed8d3001d520d747751d00a84d474ecdfb82a3fce065c6af3d9e422fe1d38cdf288e286d578a95fda836b0f02606ee4c21
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## master
|
2
|
+
|
3
|
+
### enhancements
|
4
|
+
|
5
|
+
### bug fix
|
6
|
+
|
7
|
+
## 0.10.0 (February 17, 2015) ##
|
8
|
+
|
9
|
+
### enhancements
|
10
|
+
|
11
|
+
* Add scopes support to mongoid documents (by [@nashby](https://github.com/nashby))
|
12
|
+
* Use underscore.humanize in #text to make use of Inflector acronyms (by [@mintuhouse](https://github.com/mintuhouse))
|
13
|
+
* Raise an exception when :scope option is used together with :multiple option (by [@maurogeorge](https://github.com/maurogeorge))
|
14
|
+
* Use alias_method_chain instead of overriding Class#inherited (by [@yuroyoro](https://github.com/yuroyoro))
|
15
|
+
* Shortcut methods to retrieve enumerize values (by [@CyborgMaster](https://github.com/CyborgMaster))
|
16
|
+
* Extend equality operator to support comparing with symbols and custom values (e.g. integers) (by [@CyborgMaster](https://github.com/CyborgMaster))
|
17
|
+
|
1
18
|
## 0.9.0 (December 11, 2014) ##
|
2
19
|
|
3
20
|
### enhancements
|
data/README.md
CHANGED
@@ -251,6 +251,8 @@ User.having_status(:blocked).with_sex(:male, :female)
|
|
251
251
|
# SELECT "users".* FROM "users" WHERE "users"."status" IN (2) AND "users"."sex" IN ('male', 'female')
|
252
252
|
```
|
253
253
|
|
254
|
+
:warning: It is not possible to define a scope when using the `:multiple` option. :warning:
|
255
|
+
|
254
256
|
Array-like attributes with plain ruby objects:
|
255
257
|
|
256
258
|
```ruby
|
data/lib/enumerize.rb
CHANGED
@@ -14,6 +14,11 @@ module Enumerize
|
|
14
14
|
|
15
15
|
autoload :ActiveRecordSupport, 'enumerize/activerecord'
|
16
16
|
|
17
|
+
module Scope
|
18
|
+
autoload :ActiveRecord, 'enumerize/scope/activerecord'
|
19
|
+
autoload :Mongoid, 'enumerize/scope/mongoid'
|
20
|
+
end
|
21
|
+
|
17
22
|
def self.included(base)
|
18
23
|
ActiveSupport::Deprecation.warn '`include Enumerize` was deprecated. Please use `extend Enumerize`.', caller
|
19
24
|
extended(base)
|
@@ -23,6 +28,8 @@ module Enumerize
|
|
23
28
|
base.send :include, Enumerize::Base
|
24
29
|
base.extend Enumerize::Predicates
|
25
30
|
base.extend Enumerize::ActiveRecordSupport
|
31
|
+
base.extend Enumerize::Scope::ActiveRecord if defined?(::ActiveRecord::Base)
|
32
|
+
base.extend Enumerize::Scope::Mongoid if defined?(::Mongoid::Document)
|
26
33
|
|
27
34
|
if defined?(::RailsAdmin)
|
28
35
|
require 'enumerize/integrations/rails_admin'
|
@@ -5,10 +5,6 @@ module Enumerize
|
|
5
5
|
|
6
6
|
_enumerize_module.dependent_eval do
|
7
7
|
if defined?(::ActiveRecord::Base) && self < ::ActiveRecord::Base
|
8
|
-
if options[:scope]
|
9
|
-
_define_scope_methods!(name, options)
|
10
|
-
end
|
11
|
-
|
12
8
|
include InstanceMethods
|
13
9
|
|
14
10
|
# Since Rails use `allocate` method on models and initializes them with `init_with` method.
|
@@ -21,26 +17,6 @@ module Enumerize
|
|
21
17
|
end
|
22
18
|
end
|
23
19
|
|
24
|
-
private
|
25
|
-
|
26
|
-
def _define_scope_methods!(name, options)
|
27
|
-
scope_name = options[:scope] == true ? "with_#{name}" : options[:scope]
|
28
|
-
|
29
|
-
define_singleton_method scope_name do |*values|
|
30
|
-
values = values.map { |value| enumerized_attributes[name].find_value(value).value }
|
31
|
-
values = values.first if values.size == 1
|
32
|
-
|
33
|
-
where(name => values)
|
34
|
-
end
|
35
|
-
|
36
|
-
if options[:scope] == true
|
37
|
-
define_singleton_method "without_#{name}" do |*values|
|
38
|
-
values = values.map { |value| enumerized_attributes[name].find_value(value).value }
|
39
|
-
where(arel_table[name].not_in(values))
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
20
|
module InstanceMethods
|
45
21
|
# https://github.com/brainspec/enumerize/issues/74
|
46
22
|
def write_attribute(attr_name, value)
|
data/lib/enumerize/attribute.rb
CHANGED
@@ -4,6 +4,7 @@ module Enumerize
|
|
4
4
|
|
5
5
|
def initialize(klass, name, options={})
|
6
6
|
raise ArgumentError, ':in option is required' unless options[:in]
|
7
|
+
raise ArgumentError, ':scope option does not work with option :multiple' if options[:multiple] && options[:scope]
|
7
8
|
|
8
9
|
extend Multiple if options[:multiple]
|
9
10
|
|
@@ -25,6 +26,12 @@ module Enumerize
|
|
25
26
|
@default_value = find_default_value(options[:default])
|
26
27
|
raise ArgumentError, 'invalid default value' unless @default_value
|
27
28
|
end
|
29
|
+
|
30
|
+
# Define methods to get each value
|
31
|
+
@values.each do |v|
|
32
|
+
metaclass = class << self; self; end
|
33
|
+
metaclass.send(:define_method, v.to_s) { v }
|
34
|
+
end
|
28
35
|
end
|
29
36
|
|
30
37
|
def find_default_value(value)
|
@@ -39,6 +46,10 @@ module Enumerize
|
|
39
46
|
@value_hash[value.to_s] unless value.nil?
|
40
47
|
end
|
41
48
|
|
49
|
+
def find_values(*values)
|
50
|
+
values.map { |value| find_value(value) }.compact
|
51
|
+
end
|
52
|
+
|
42
53
|
def i18n_scopes
|
43
54
|
@i18n_scopes ||= if i18n_scope
|
44
55
|
scopes = Array(i18n_scope)
|
data/lib/enumerize/base.rb
CHANGED
@@ -6,6 +6,14 @@ module Enumerize
|
|
6
6
|
if base.respond_to?(:validate)
|
7
7
|
base.validate :_validate_enumerized_attributes
|
8
8
|
end
|
9
|
+
|
10
|
+
class << base
|
11
|
+
if (method_defined?(:inherited) || private_method_defined?(:inherited)) && (not method_defined? :inherited_without_enumerized)
|
12
|
+
alias_method :inherited_without_enumerized, :inherited
|
13
|
+
end
|
14
|
+
|
15
|
+
alias_method :inherited, :inherited_with_enumerized
|
16
|
+
end
|
9
17
|
end
|
10
18
|
|
11
19
|
module ClassMethods
|
@@ -28,9 +36,11 @@ module Enumerize
|
|
28
36
|
@enumerized_attributes ||= AttributeMap.new
|
29
37
|
end
|
30
38
|
|
31
|
-
def
|
39
|
+
def inherited_with_enumerized(subclass)
|
32
40
|
enumerized_attributes.add_dependant subclass.enumerized_attributes
|
33
|
-
|
41
|
+
if respond_to?(:inherited_without_enumerized, true)
|
42
|
+
inherited_without_enumerized subclass
|
43
|
+
end
|
34
44
|
end
|
35
45
|
|
36
46
|
private
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Enumerize
|
2
|
+
module Scope
|
3
|
+
module ActiveRecord
|
4
|
+
def enumerize(name, options={})
|
5
|
+
super
|
6
|
+
|
7
|
+
_enumerize_module.dependent_eval do
|
8
|
+
if self < ::ActiveRecord::Base
|
9
|
+
if options[:scope]
|
10
|
+
_define_scope_methods!(name, options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def _define_scope_methods!(name, options)
|
19
|
+
scope_name = options[:scope] == true ? "with_#{name}" : options[:scope]
|
20
|
+
|
21
|
+
define_singleton_method scope_name do |*values|
|
22
|
+
values = enumerized_attributes[name].find_values(*values).map(&:value)
|
23
|
+
values = values.first if values.size == 1
|
24
|
+
|
25
|
+
where(name => values)
|
26
|
+
end
|
27
|
+
|
28
|
+
if options[:scope] == true
|
29
|
+
define_singleton_method "without_#{name}" do |*values|
|
30
|
+
values = enumerized_attributes[name].find_values(*values).map(&:value)
|
31
|
+
where(arel_table[name].not_in(values))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Enumerize
|
2
|
+
module Scope
|
3
|
+
module Mongoid
|
4
|
+
def enumerize(name, options={})
|
5
|
+
super
|
6
|
+
|
7
|
+
_enumerize_module.dependent_eval do
|
8
|
+
if self < ::Mongoid::Document
|
9
|
+
if options[:scope]
|
10
|
+
_define_scope_methods!(name, options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def _define_scope_methods!(name, options)
|
19
|
+
scope_name = options[:scope] == true ? "with_#{name}" : options[:scope]
|
20
|
+
|
21
|
+
define_singleton_method scope_name do |*values|
|
22
|
+
values = enumerized_attributes[name].find_values(*values).map(&:value)
|
23
|
+
|
24
|
+
if values.size == 1
|
25
|
+
where(name => values.first)
|
26
|
+
else
|
27
|
+
where(name.in => values)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if options[:scope] == true
|
32
|
+
define_singleton_method "without_#{name}" do |*values|
|
33
|
+
values = enumerized_attributes[name].find_values(*values).map(&:value)
|
34
|
+
not_in(name => values)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/enumerize/value.rb
CHANGED
@@ -17,6 +17,10 @@ module Enumerize
|
|
17
17
|
I18n.t(i18n_keys[0], :default => i18n_keys[1..-1])
|
18
18
|
end
|
19
19
|
|
20
|
+
def ==(other)
|
21
|
+
super(other.to_s) || value == other
|
22
|
+
end
|
23
|
+
|
20
24
|
def encode_with(coder)
|
21
25
|
coder.represent_object(self.class.superclass, @value)
|
22
26
|
end
|
@@ -36,7 +40,7 @@ module Enumerize
|
|
36
40
|
i18n_keys = i18n_scopes
|
37
41
|
i18n_keys << [:"enumerize.defaults.#{@attr.name}.#{self}"]
|
38
42
|
i18n_keys << [:"enumerize.#{@attr.name}.#{self}"]
|
39
|
-
i18n_keys << self.humanize # humanize value if there are no translations
|
43
|
+
i18n_keys << self.underscore.humanize # humanize value if there are no translations
|
40
44
|
i18n_keys.flatten
|
41
45
|
end
|
42
46
|
end
|
data/lib/enumerize/version.rb
CHANGED
data/test/activerecord_test.rb
CHANGED
@@ -242,6 +242,12 @@ describe Enumerize::ActiveRecordSupport do
|
|
242
242
|
User.having_role(:admin).must_equal [user_1]
|
243
243
|
end
|
244
244
|
|
245
|
+
it 'ignores not enumerized values that passed to the scope method' do
|
246
|
+
User.delete_all
|
247
|
+
|
248
|
+
User.with_status(:foo).must_equal []
|
249
|
+
end
|
250
|
+
|
245
251
|
it 'allows either key or value as valid' do
|
246
252
|
user_1 = User.new(status: :active)
|
247
253
|
user_2 = User.new(status: 1)
|
data/test/attribute_test.rb
CHANGED
@@ -85,6 +85,14 @@ describe Enumerize::Attribute do
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
+
it 'sets up shortcut methods for each value' do
|
89
|
+
build_attr nil, :foo, :in => {:a => 1, :b => 2}
|
90
|
+
attr.a.value.must_equal 1
|
91
|
+
attr.b.value.must_equal 2
|
92
|
+
attr.a.text.must_equal 'A'
|
93
|
+
attr.b.text.must_equal 'B'
|
94
|
+
end
|
95
|
+
|
88
96
|
describe 'values hash with zero' do
|
89
97
|
before do
|
90
98
|
build_attr nil, :foo, :in => {:a => 1, :b => 2, :c => 0}
|
@@ -99,6 +107,10 @@ describe Enumerize::Attribute do
|
|
99
107
|
attr.find_value(2).must_equal 'b'
|
100
108
|
attr.find_value(0).must_equal 'c'
|
101
109
|
end
|
110
|
+
|
111
|
+
it 'finds all values by hash values' do
|
112
|
+
attr.find_values(1, 2, 0).must_equal ['a', 'b', 'c']
|
113
|
+
end
|
102
114
|
end
|
103
115
|
|
104
116
|
describe 'boolean values hash' do
|
data/test/mongoid_test.rb
CHANGED
@@ -17,8 +17,8 @@ describe Enumerize do
|
|
17
17
|
|
18
18
|
field :sex
|
19
19
|
field :role
|
20
|
-
enumerize :sex, :in => %w[male female]
|
21
|
-
enumerize :role, :in => %w[admin user], :default => 'user'
|
20
|
+
enumerize :sex, :in => %w[male female], scope: true
|
21
|
+
enumerize :role, :in => %w[admin user], :default => 'user', scope: :having_role
|
22
22
|
enumerize :mult, :in => %w[one two three four], :multiple => true
|
23
23
|
end
|
24
24
|
|
@@ -76,4 +76,28 @@ describe Enumerize do
|
|
76
76
|
user = model.first
|
77
77
|
user.mult.to_a.must_equal ['one', 'two']
|
78
78
|
end
|
79
|
+
|
80
|
+
it 'adds scope' do
|
81
|
+
model.delete_all
|
82
|
+
|
83
|
+
user_1 = model.create!(sex: :male, role: :admin)
|
84
|
+
user_2 = model.create!(sex: :female, role: :user)
|
85
|
+
|
86
|
+
model.with_sex(:male).to_a.must_equal [user_1]
|
87
|
+
model.with_sex(:female).to_a.must_equal [user_2]
|
88
|
+
model.with_sex(:male, :female).to_set.must_equal [user_1, user_2].to_set
|
89
|
+
|
90
|
+
model.without_sex(:male).to_a.must_equal [user_2]
|
91
|
+
model.without_sex(:female).to_a.must_equal [user_1]
|
92
|
+
model.without_sex(:male, :female).to_a.must_equal []
|
93
|
+
|
94
|
+
model.having_role(:admin).to_a.must_equal [user_1]
|
95
|
+
model.having_role(:user).to_a.must_equal [user_2]
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'ignores not enumerized values that passed to the scope method' do
|
99
|
+
model.delete_all
|
100
|
+
|
101
|
+
model.with_sex(:foo).must_equal []
|
102
|
+
end
|
79
103
|
end
|
data/test/multiple_test.rb
CHANGED
@@ -33,4 +33,10 @@ describe Enumerize::Base do
|
|
33
33
|
klass.enumerize :foos, in: %w(a b c), multiple: true
|
34
34
|
object.wont_respond_to :foos_value
|
35
35
|
end
|
36
|
+
|
37
|
+
it "cannot define multiple with scope" do
|
38
|
+
assert_raises ArgumentError do
|
39
|
+
klass.enumerize :foos, in: %w(a b c), multiple: true, scope: true
|
40
|
+
end
|
41
|
+
end
|
36
42
|
end
|
data/test/value_test.rb
CHANGED
@@ -2,14 +2,27 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
describe Enumerize::Value do
|
4
4
|
let(:attr) { Struct.new(:values).new([]) }
|
5
|
-
let(:value) { Enumerize::Value.new(attr, 'test_value') }
|
5
|
+
let(:value) { Enumerize::Value.new(attr, 'test_value', 1) }
|
6
6
|
|
7
7
|
it 'is a string' do
|
8
8
|
value.must_be_kind_of String
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
describe 'equality' do
|
12
|
+
it 'is compared to string' do
|
13
|
+
value.must_be :==, 'test_value'
|
14
|
+
value.wont_be :==, 'not_value'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'is compared to symbol' do
|
18
|
+
value.must_be :==, :test_value
|
19
|
+
value.wont_be :==, :not_value
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'is compared to integer' do
|
23
|
+
value.must_be :==, 1
|
24
|
+
value.wont_be :==, 2
|
25
|
+
end
|
13
26
|
end
|
14
27
|
|
15
28
|
describe 'translation' do
|
@@ -106,6 +119,8 @@ describe Enumerize::Value do
|
|
106
119
|
end
|
107
120
|
|
108
121
|
describe 'serialization' do
|
122
|
+
let(:value) { Enumerize::Value.new(attr, 'test_value') }
|
123
|
+
|
109
124
|
it 'should be serialized to yaml as string value' do
|
110
125
|
assert_equal YAML.dump('test_value'), YAML.dump(value)
|
111
126
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumerize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergey Nartimov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -56,6 +56,8 @@ files:
|
|
56
56
|
- lib/enumerize/module_attributes.rb
|
57
57
|
- lib/enumerize/predicatable.rb
|
58
58
|
- lib/enumerize/predicates.rb
|
59
|
+
- lib/enumerize/scope/activerecord.rb
|
60
|
+
- lib/enumerize/scope/mongoid.rb
|
59
61
|
- lib/enumerize/set.rb
|
60
62
|
- lib/enumerize/value.rb
|
61
63
|
- lib/enumerize/version.rb
|
@@ -97,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
99
|
version: '0'
|
98
100
|
requirements: []
|
99
101
|
rubyforge_project:
|
100
|
-
rubygems_version: 2.
|
102
|
+
rubygems_version: 2.4.5
|
101
103
|
signing_key:
|
102
104
|
specification_version: 4
|
103
105
|
summary: Enumerated attributes with I18n and ActiveRecord/Mongoid/MongoMapper support
|