enumerize 0.9.0 → 0.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 89ff95b68f2d587db0234b6cae3b434c904b8575
4
- data.tar.gz: d758065069a4f5ab996281648c12df3a4ba70b1f
3
+ metadata.gz: 964f689869d7570459451bae1068a737f69a7db2
4
+ data.tar.gz: b1c59894d98bd2656d01c5bca52f4dc15a7fa42a
5
5
  SHA512:
6
- metadata.gz: 91ee9ff2df723ab6e83155fe4e9697f9e8dcf12cd11b42dbb0822de7da4c2050269561f51e316ec6ac71b3e3ea77cfc74c70eb899a24af34366cf6a657e9fa3b
7
- data.tar.gz: 2e77cbb5dbe9abb980984ce5837ad41009ad5dddc9bf13ceae86dccb58d294feead696a6cbff41a517607587284ba26bb04bfa4d65b82e31e864fed6c72c6ccb
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)
@@ -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)
@@ -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 inherited(subclass)
39
+ def inherited_with_enumerized(subclass)
32
40
  enumerized_attributes.add_dependant subclass.enumerized_attributes
33
- super
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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Enumerize
2
- VERSION = "0.9.0"
2
+ VERSION = "0.10.0"
3
3
  end
@@ -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)
@@ -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
@@ -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
- it 'is compared to string' do
12
- value.must_be :==, 'test_value'
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.9.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: 2014-12-11 00:00:00.000000000 Z
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.2.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