enumerize 0.7.0 → 0.8.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 +7 -0
- data/.travis.yml +1 -4
- data/CHANGELOG.md +18 -1
- data/Gemfile +7 -0
- data/Gemfile.rails4 +10 -3
- data/README.md +45 -0
- data/lib/enumerize/activerecord.rb +34 -15
- data/lib/enumerize/attribute.rb +16 -3
- data/lib/enumerize/base.rb +9 -1
- data/lib/enumerize/hooks/simple_form.rb +13 -2
- data/lib/enumerize/hooks/uniqueness.rb +23 -0
- data/lib/enumerize/integrations/rails_admin.rb +1 -1
- data/lib/enumerize/integrations/rspec/matcher.rb +3 -1
- data/lib/enumerize/value.rb +12 -14
- data/lib/enumerize/version.rb +1 -1
- data/lib/enumerize.rb +7 -3
- data/test/activerecord_test.rb +67 -1
- data/test/attribute_test.rb +42 -0
- data/test/mongoid_test.rb +9 -0
- data/test/rails_admin_test.rb +7 -0
- data/test/rspec_matcher_test.rb +23 -0
- data/test/simple_form_test.rb +9 -0
- data/test/value_test.rb +27 -1
- metadata +14 -20
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f08aba602317c54ffaf5f735e09a205a5d1a624c
|
4
|
+
data.tar.gz: 87f7613830f330b958dbd0a61f7a7ac89c262623
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a0226ef792ee39084f80286b886880003659bec15c62e1e98938048e6b3accb03b04330591e92d42a2d79f94fb874d80fe14395b4007d3576ac1285bb0b3ff77
|
7
|
+
data.tar.gz: 48448538be205b068c3c7f01ca68c6780e7e4d2fd0db6f353455ab1462f8db587e744633cd605c7872b77f6bf6ecd353e1ba076998ebc04108e04322ab024c48
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## 0.8.0 (March 4, 2014) ##
|
2
|
+
|
3
|
+
### enhancements
|
4
|
+
* Integration with SimpleForm's `input_field` (by [@nashby](https://github.com/nashby))
|
5
|
+
* Support multiple attributes in Active Record #becomes method (by [@lest](https://github.com/lest))
|
6
|
+
* Add ability to specify localization scope with `i18n_scope` option (by [@dreamfall](https://github.com/dreamfall))
|
7
|
+
|
8
|
+
### bug fix
|
9
|
+
* Fix Rails Admin integration when custom values are used (by [@brenes](https://github.com/brenes))
|
10
|
+
* Fix RSpec integration using enumerize with Spring (by [@winston](https://github.com/winston))
|
11
|
+
* Return proper RSpec failure message for enumerized attribute with default value (by [@nashby](https://github.com/nashby))
|
12
|
+
* Return proper RSpec description for enumerized attribute without default value (by [@andreygerasimchuk](https://github.com/andreygerasimchuk))
|
13
|
+
* Do not try to set default value for not selected attributes (by [@nashby](https://github.com/nashby))
|
14
|
+
* Fix uniqueness validation with Active Record (by [@lest](https://github.com/lest))
|
15
|
+
* Fix loading of attributes with multiple: true in mongoid (by [glebtv](https://github.com/glebtv))
|
16
|
+
* Serialize value as scalar type (by [@ka8725](https://github.com/ka8725))
|
17
|
+
|
1
18
|
## 0.7.0 (August 21, 2013) ##
|
2
19
|
|
3
20
|
### enhancements
|
@@ -22,7 +39,7 @@
|
|
22
39
|
|
23
40
|
### enhancements
|
24
41
|
* Use inclusion error message for invalid values (by [@lest](https://github.com/lest))
|
25
|
-
* Add `:only` and `except` options to the `Attribute#options` method. (by [@thehappycoder](https://github.com/thehappycoder))
|
42
|
+
* Add `:only` and `except` options to the `Attribute#options` method. (by [@thehappycoder](https://github.com/thehappycoder) and [@randoum](https://github.com/randoum))
|
26
43
|
* ActiveRecord scopes. (by [@lest](https://github.com/lest), [@banyan](https://github.com/banyan) and [@nashby](https://github.com/nashby))
|
27
44
|
* Support for RailsAdmin (by [@drewda](https://github.com/drewda))
|
28
45
|
|
data/Gemfile
CHANGED
@@ -10,6 +10,13 @@ gem 'rails', '~> 3.2.0', :require => false
|
|
10
10
|
gem 'sqlite3', :platform => [:ruby, :mswin, :mingw]
|
11
11
|
gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
|
12
12
|
|
13
|
+
platforms :rbx do
|
14
|
+
gem 'rubysl', '~> 2.0'
|
15
|
+
gem 'psych'
|
16
|
+
gem 'rubinius-developer_tools'
|
17
|
+
gem 'rubysl-test-unit'
|
18
|
+
end
|
19
|
+
|
13
20
|
gem 'mongoid'
|
14
21
|
gem 'mongo_mapper'
|
15
22
|
gem 'simple_form'
|
data/Gemfile.rails4
CHANGED
@@ -6,11 +6,18 @@ gem 'rake'
|
|
6
6
|
gem 'minitest', '~> 4.1'
|
7
7
|
gem 'rspec', :require => false
|
8
8
|
|
9
|
-
gem 'rails', '4.0.
|
9
|
+
gem 'rails', '4.0.1', :require => false
|
10
10
|
gem 'sqlite3', :platform => [:ruby, :mswin, :mingw]
|
11
11
|
gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
|
12
12
|
|
13
|
-
|
13
|
+
platforms :rbx do
|
14
|
+
gem 'rubysl', '~> 2.0'
|
15
|
+
gem 'psych'
|
16
|
+
gem 'rubinius-developer_tools'
|
17
|
+
gem 'rubysl-test-unit'
|
18
|
+
end
|
19
|
+
|
20
|
+
gem 'mongoid', github: 'mongoid/mongoid', ref: 'f91feef0a0c6b83a1b878e154f1014536aa1c298'
|
14
21
|
gem 'mongo_mapper', github: 'jnunemaker/mongomapper'
|
15
|
-
gem 'simple_form'
|
22
|
+
gem 'simple_form'
|
16
23
|
gem 'formtastic', github: 'justinfrench/formtastic'
|
data/README.md
CHANGED
@@ -28,6 +28,9 @@ class User
|
|
28
28
|
end
|
29
29
|
```
|
30
30
|
|
31
|
+
Note that enumerized values are just identificators so if you want to use multi-word, etc. values you should use `I18n` feature.
|
32
|
+
|
33
|
+
|
31
34
|
ActiveRecord:
|
32
35
|
|
33
36
|
```ruby
|
@@ -85,6 +88,30 @@ en:
|
|
85
88
|
female: "Female"
|
86
89
|
```
|
87
90
|
|
91
|
+
You can also pass `i18n_scope` option to specify scope (or array of scopes) storring the translations. Note that `i18n_scope` option does not accept scope as array:
|
92
|
+
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
class Person
|
96
|
+
extend Enumerize
|
97
|
+
extend ActiveModel::Naming
|
98
|
+
|
99
|
+
enumerize :sex, in: %w[male female], i18n_scope: "sex"
|
100
|
+
enumerize :color, in: %w[black white], i18n_scope: ["various.colors", "colors"]
|
101
|
+
end
|
102
|
+
|
103
|
+
# localization file
|
104
|
+
en:
|
105
|
+
sex:
|
106
|
+
male: "Male"
|
107
|
+
female: "Female"
|
108
|
+
various:
|
109
|
+
colors:
|
110
|
+
black: "Black"
|
111
|
+
colors:
|
112
|
+
white: "White"
|
113
|
+
```
|
114
|
+
|
88
115
|
Note that if you want to use I18n feature with plain Ruby object don't forget to extend it with `ActiveModel::Naming`:
|
89
116
|
|
90
117
|
```ruby
|
@@ -188,6 +215,9 @@ user = User.new
|
|
188
215
|
user.role = :user
|
189
216
|
user.role #=> 'user'
|
190
217
|
user.role_value #=> 1
|
218
|
+
|
219
|
+
User.role.find_value(:user).value #=> 1
|
220
|
+
User.role.find_value(:admin).value #=> 2
|
191
221
|
```
|
192
222
|
|
193
223
|
ActiveRecord scopes:
|
@@ -287,6 +317,21 @@ describe User do
|
|
287
317
|
end
|
288
318
|
```
|
289
319
|
|
320
|
+
### Minitest with Shoulda
|
321
|
+
|
322
|
+
You can use the RSpec matcher with shoulda in your tests by adding two lines in your `test_helper.rb` inside `class ActiveSupport::TestCase` definition:
|
323
|
+
|
324
|
+
```ruby
|
325
|
+
class ActiveSupport::TestCase
|
326
|
+
ActiveRecord::Migration.check_pending!
|
327
|
+
|
328
|
+
require 'enumerize/integrations/rspec'
|
329
|
+
extend Enumerize::Integrations::RSpec
|
330
|
+
|
331
|
+
...
|
332
|
+
end
|
333
|
+
```
|
334
|
+
|
290
335
|
### Other Integrations
|
291
336
|
|
292
337
|
Enumerize integrates with the following automatically:
|
@@ -1,26 +1,22 @@
|
|
1
1
|
module Enumerize
|
2
|
-
module
|
2
|
+
module ActiveRecordSupport
|
3
3
|
def enumerize(name, options={})
|
4
4
|
super
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
if
|
6
|
+
_enumerize_module.dependent_eval do
|
7
|
+
if defined?(::ActiveRecord::Base) && self < ::ActiveRecord::Base
|
8
|
+
if options[:scope]
|
9
9
|
_define_scope_methods!(name, options)
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
# https://github.com/brainspec/enumerize/issues/74
|
13
|
-
def write_attribute(attr_name, value)
|
14
|
-
_enumerized_values_for_validation[attr_name] = value
|
12
|
+
include InstanceMethods
|
15
13
|
|
16
|
-
|
17
|
-
|
14
|
+
# Since Rails use `allocate` method on models and initializes them with `init_with` method.
|
15
|
+
# This way `initialize` method is not being called, but `after_initialize` callback always gets triggered.
|
16
|
+
after_initialize :_set_default_value_for_enumerized_attributes
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
after_initialize :_set_default_value_for_enumerized_attributes
|
22
|
-
end
|
23
|
-
end
|
18
|
+
# https://github.com/brainspec/enumerize/issues/111
|
19
|
+
require 'enumerize/hooks/uniqueness'
|
24
20
|
end
|
25
21
|
end
|
26
22
|
end
|
@@ -44,5 +40,28 @@ module Enumerize
|
|
44
40
|
end
|
45
41
|
end
|
46
42
|
end
|
43
|
+
|
44
|
+
module InstanceMethods
|
45
|
+
# https://github.com/brainspec/enumerize/issues/74
|
46
|
+
def write_attribute(attr_name, value)
|
47
|
+
if self.class.enumerized_attributes[attr_name]
|
48
|
+
_enumerized_values_for_validation[attr_name] = value
|
49
|
+
end
|
50
|
+
|
51
|
+
super
|
52
|
+
end
|
53
|
+
|
54
|
+
# Support multiple enumerized attributes
|
55
|
+
def becomes(klass)
|
56
|
+
became = super
|
57
|
+
klass.enumerized_attributes.each do |attr|
|
58
|
+
if attr.is_a? Multiple
|
59
|
+
became.send("#{attr.name}=", send(attr.name))
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
became
|
64
|
+
end
|
65
|
+
end
|
47
66
|
end
|
48
67
|
end
|
data/lib/enumerize/attribute.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Enumerize
|
2
2
|
class Attribute
|
3
|
-
attr_reader :name, :values, :default_value
|
3
|
+
attr_reader :name, :values, :default_value, :i18n_scope
|
4
4
|
|
5
5
|
def initialize(klass, name, options={})
|
6
6
|
raise ArgumentError, ':in option is required' unless options[:in]
|
@@ -13,6 +13,11 @@ module Enumerize
|
|
13
13
|
@value_hash = Hash[@values.map { |v| [v.value.to_s, v] }]
|
14
14
|
@value_hash.merge! Hash[@values.map { |v| [v.to_s, v] }]
|
15
15
|
|
16
|
+
if options[:i18n_scope]
|
17
|
+
raise ArgumentError, ':i18n_scope option accepts only String or Array of strings' unless Array(options[:i18n_scope]).all? { |s| s.is_a?(String) }
|
18
|
+
@i18n_scope = options[:i18n_scope]
|
19
|
+
end
|
20
|
+
|
16
21
|
if options[:default]
|
17
22
|
@default_value = find_default_value(options[:default])
|
18
23
|
raise ArgumentError, 'invalid default value' unless @default_value
|
@@ -31,8 +36,14 @@ module Enumerize
|
|
31
36
|
@value_hash[value.to_s] unless value.nil?
|
32
37
|
end
|
33
38
|
|
34
|
-
def
|
35
|
-
@
|
39
|
+
def i18n_scopes
|
40
|
+
@i18n_scopes ||= if i18n_scope
|
41
|
+
scopes = Array(i18n_scope)
|
42
|
+
elsif @klass.respond_to?(:model_name)
|
43
|
+
scopes = ["enumerize.#{@klass.model_name.i18n_key}.#{name}"]
|
44
|
+
else
|
45
|
+
[]
|
46
|
+
end
|
36
47
|
end
|
37
48
|
|
38
49
|
def options(options = {})
|
@@ -105,6 +116,8 @@ module Enumerize
|
|
105
116
|
unless defined?(@_#{name}_enumerized_set)
|
106
117
|
if defined?(super)
|
107
118
|
self.#{name} = super
|
119
|
+
elsif respond_to?(:read_attribute)
|
120
|
+
self.#{name} = read_attribute(:#{name})
|
108
121
|
else
|
109
122
|
if defined?(@#{name})
|
110
123
|
self.#{name} = @#{name}
|
data/lib/enumerize/base.rb
CHANGED
@@ -78,7 +78,15 @@ module Enumerize
|
|
78
78
|
|
79
79
|
def _set_default_value_for_enumerized_attributes
|
80
80
|
self.class.enumerized_attributes.each do |attr|
|
81
|
-
|
81
|
+
# remove after dropping support for Rails 3.x
|
82
|
+
# https://github.com/brainspec/enumerize/issues/101
|
83
|
+
attr_value = begin
|
84
|
+
public_send(attr.name)
|
85
|
+
rescue ActiveModel::MissingAttributeError
|
86
|
+
nil
|
87
|
+
end
|
88
|
+
|
89
|
+
if !attr_value && !_enumerized_values_for_validation.key?(attr.name)
|
82
90
|
value = attr.default_value
|
83
91
|
|
84
92
|
if value.respond_to?(:call)
|
@@ -7,9 +7,22 @@ module Enumerize
|
|
7
7
|
|
8
8
|
included do
|
9
9
|
alias_method_chain :input, :enumerize
|
10
|
+
alias_method_chain :input_field, :enumerize
|
10
11
|
end
|
11
12
|
|
12
13
|
def input_with_enumerize(attribute_name, options={}, &block)
|
14
|
+
add_input_options_for_enumerized_attribute(attribute_name, options)
|
15
|
+
input_without_enumerize(attribute_name, options, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def input_field_with_enumerize(attribute_name, options={})
|
19
|
+
add_input_options_for_enumerized_attribute(attribute_name, options)
|
20
|
+
input_field_without_enumerize(attribute_name, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def add_input_options_for_enumerized_attribute(attribute_name, options)
|
13
26
|
klass = object.class
|
14
27
|
|
15
28
|
if klass.respond_to?(:enumerized_attributes) && (attr = klass.enumerized_attributes[attribute_name])
|
@@ -19,8 +32,6 @@ module Enumerize
|
|
19
32
|
options[:input_html] = options.fetch(:input_html, {}).merge(:multiple => true)
|
20
33
|
end
|
21
34
|
end
|
22
|
-
|
23
|
-
input_without_enumerize(attribute_name, options, &block)
|
24
35
|
end
|
25
36
|
end
|
26
37
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module Enumerize
|
4
|
+
module Hooks
|
5
|
+
module UniquenessValidator
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
alias_method_chain :validate_each, :enumerize
|
10
|
+
end
|
11
|
+
|
12
|
+
def validate_each_with_enumerize(record, name, value)
|
13
|
+
if record.class.respond_to?(:enumerized_attributes) && (attr = record.class.enumerized_attributes[name])
|
14
|
+
value = attr.find_value(value).try(:value)
|
15
|
+
end
|
16
|
+
|
17
|
+
validate_each_without_enumerize(record, name, value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
::ActiveRecord::Validations::UniquenessValidator.send :include, Enumerize::Hooks::UniquenessValidator
|
@@ -22,7 +22,7 @@ module Enumerize
|
|
22
22
|
message = " expected :#{attr} to allow value#{values.size == 1 ? nil : 's'}: #{quote_values(values)},"
|
23
23
|
message += " but it allows #{quote_values(enumerized_values)} instead"
|
24
24
|
|
25
|
-
if default
|
25
|
+
if default && !matches_default_value?
|
26
26
|
message = " expected :#{attr} to have #{default.inspect} as default value,"
|
27
27
|
message += " but it sets #{enumerized_default.inspect} instead"
|
28
28
|
end
|
@@ -33,6 +33,8 @@ module Enumerize
|
|
33
33
|
def description
|
34
34
|
description = "enumerize :#{attr} in: #{quote_values(values)}"
|
35
35
|
description += " with #{default.inspect} as default value" if default
|
36
|
+
|
37
|
+
description
|
36
38
|
end
|
37
39
|
|
38
40
|
def matches?(subject)
|
data/lib/enumerize/value.rb
CHANGED
@@ -4,21 +4,23 @@ module Enumerize
|
|
4
4
|
class Value < String
|
5
5
|
include Predicatable
|
6
6
|
|
7
|
+
attr_reader :value
|
8
|
+
|
7
9
|
def initialize(attr, name, value=nil)
|
8
10
|
@attr = attr
|
9
|
-
@value = value
|
11
|
+
@value = value.nil? ? name.to_s : value
|
10
12
|
|
11
13
|
super(name.to_s)
|
12
14
|
end
|
13
15
|
|
14
|
-
def value
|
15
|
-
@value
|
16
|
-
end
|
17
|
-
|
18
16
|
def text
|
19
17
|
I18n.t(i18n_keys[0], :default => i18n_keys[1..-1])
|
20
18
|
end
|
21
19
|
|
20
|
+
def encode_with(coder)
|
21
|
+
coder.represent_object(self.class.superclass, @value)
|
22
|
+
end
|
23
|
+
|
22
24
|
private
|
23
25
|
|
24
26
|
def define_query_method(value)
|
@@ -31,19 +33,15 @@ module Enumerize
|
|
31
33
|
|
32
34
|
def i18n_keys
|
33
35
|
@i18n_keys ||= begin
|
34
|
-
i18n_keys =
|
35
|
-
i18n_keys <<
|
36
|
-
i18n_keys << i18n_scope
|
36
|
+
i18n_keys = i18n_scopes
|
37
|
+
i18n_keys << [:"enumerize.#{@attr.name}.#{self}"]
|
37
38
|
i18n_keys << self.humanize # humanize value if there are no translations
|
39
|
+
i18n_keys.flatten
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
41
|
-
def
|
42
|
-
:"
|
43
|
-
end
|
44
|
-
|
45
|
-
def i18n_suffix
|
46
|
-
"#{@attr.i18n_suffix}." if @attr.i18n_suffix
|
43
|
+
def i18n_scopes
|
44
|
+
@attr.i18n_scopes.map { |s| :"#{s}.#{self}" }
|
47
45
|
end
|
48
46
|
end
|
49
47
|
end
|
data/lib/enumerize/version.rb
CHANGED
data/lib/enumerize.rb
CHANGED
@@ -8,11 +8,12 @@ module Enumerize
|
|
8
8
|
autoload :Set, 'enumerize/set'
|
9
9
|
autoload :Base, 'enumerize/base'
|
10
10
|
autoload :Module, 'enumerize/module'
|
11
|
-
autoload :ActiveRecord, 'enumerize/activerecord'
|
12
11
|
autoload :Predicates, 'enumerize/predicates'
|
13
12
|
autoload :Predicatable, 'enumerize/predicatable'
|
14
13
|
autoload :ModuleAttributes, 'enumerize/module_attributes'
|
15
14
|
|
15
|
+
autoload :ActiveRecordSupport, 'enumerize/activerecord'
|
16
|
+
|
16
17
|
def self.included(base)
|
17
18
|
ActiveSupport::Deprecation.warn '`include Enumerize` was deprecated. Please use `extend Enumerize`.', caller
|
18
19
|
extended(base)
|
@@ -21,7 +22,7 @@ module Enumerize
|
|
21
22
|
def self.extended(base)
|
22
23
|
base.send :include, Enumerize::Base
|
23
24
|
base.extend Enumerize::Predicates
|
24
|
-
base.extend Enumerize::
|
25
|
+
base.extend Enumerize::ActiveRecordSupport
|
25
26
|
|
26
27
|
if defined?(::RailsAdmin)
|
27
28
|
require 'enumerize/integrations/rails_admin'
|
@@ -49,7 +50,10 @@ module Enumerize
|
|
49
50
|
rescue LoadError
|
50
51
|
end
|
51
52
|
|
52
|
-
|
53
|
+
begin
|
54
|
+
require 'rspec/matchers'
|
55
|
+
rescue LoadError
|
56
|
+
else
|
53
57
|
require 'enumerize/integrations/rspec'
|
54
58
|
end
|
55
59
|
end
|
data/test/activerecord_test.rb
CHANGED
@@ -21,6 +21,7 @@ ActiveRecord::Base.connection.instance_eval do
|
|
21
21
|
|
22
22
|
create_table :documents do |t|
|
23
23
|
t.string :visibility
|
24
|
+
t.timestamps
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
@@ -54,7 +55,11 @@ class User < ActiveRecord::Base
|
|
54
55
|
enumerize :account_type, :in => [:basic, :premium]
|
55
56
|
end
|
56
57
|
|
57
|
-
|
58
|
+
class UniqStatusUser < User
|
59
|
+
validates :status, uniqueness: true
|
60
|
+
end
|
61
|
+
|
62
|
+
describe Enumerize::ActiveRecordSupport do
|
58
63
|
it 'sets nil if invalid value is passed' do
|
59
64
|
user = User.new
|
60
65
|
user.sex = :invalid
|
@@ -84,6 +89,12 @@ describe Enumerize::ActiveRecord do
|
|
84
89
|
User.new.attributes['role'].must_equal 'user'
|
85
90
|
end
|
86
91
|
|
92
|
+
it 'does not set default value for not selected attributes' do
|
93
|
+
User.delete_all
|
94
|
+
User.create!(:sex => :male)
|
95
|
+
User.select(:id).collect(&:id)
|
96
|
+
end
|
97
|
+
|
87
98
|
it 'has default value with lambda' do
|
88
99
|
User.new.lambda_role.must_equal 'admin'
|
89
100
|
User.new.attributes['lambda_role'].must_equal 'admin'
|
@@ -189,6 +200,8 @@ describe Enumerize::ActiveRecord do
|
|
189
200
|
end
|
190
201
|
|
191
202
|
it 'adds scope' do
|
203
|
+
User.delete_all
|
204
|
+
|
192
205
|
user_1 = User.create!(status: :active, role: :admin)
|
193
206
|
user_2 = User.create!(status: :blocked)
|
194
207
|
|
@@ -217,15 +230,68 @@ describe Enumerize::ActiveRecord do
|
|
217
230
|
end
|
218
231
|
|
219
232
|
it 'supports defining enumerized attributes on abstract class' do
|
233
|
+
Document.delete_all
|
234
|
+
|
220
235
|
document = Document.new
|
221
236
|
document.visibility = :protected
|
222
237
|
document.visibility.must_equal 'protected'
|
223
238
|
end
|
224
239
|
|
225
240
|
it 'supports defining enumerized scopes on abstract class' do
|
241
|
+
Document.delete_all
|
242
|
+
|
226
243
|
document_1 = Document.create!(visibility: :public)
|
227
244
|
document_2 = Document.create!(visibility: :private)
|
228
245
|
|
229
246
|
Document.with_visibility(:public).must_equal [document_1]
|
230
247
|
end
|
248
|
+
|
249
|
+
it 'validates uniqueness' do
|
250
|
+
user = User.new
|
251
|
+
user.status = :active
|
252
|
+
user.save!
|
253
|
+
|
254
|
+
user = UniqStatusUser.new
|
255
|
+
user.status = :active
|
256
|
+
user.valid?
|
257
|
+
|
258
|
+
user.errors[:status].wont_be :empty?
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'supports multiple attributes in #becomes' do
|
262
|
+
User.delete_all
|
263
|
+
|
264
|
+
uniq_user = UniqStatusUser.new
|
265
|
+
uniq_user.interests = [:sports, :dancing]
|
266
|
+
uniq_user.sex = :male
|
267
|
+
uniq_user.save!
|
268
|
+
|
269
|
+
user = uniq_user.becomes(User)
|
270
|
+
|
271
|
+
user.sex.must_equal uniq_user.sex
|
272
|
+
user.interests.must_equal uniq_user.interests
|
273
|
+
end
|
274
|
+
|
275
|
+
it "doesn't update record" do
|
276
|
+
Document.delete_all
|
277
|
+
|
278
|
+
expected = Time.utc(2010, 10, 10)
|
279
|
+
|
280
|
+
document = Document.new
|
281
|
+
document.updated_at = expected
|
282
|
+
document.save!
|
283
|
+
|
284
|
+
document = Document.last
|
285
|
+
document.save!
|
286
|
+
|
287
|
+
assert_equal expected, document.updated_at
|
288
|
+
end
|
289
|
+
|
290
|
+
it 'changes from dirty should be serialized as scalar values' do
|
291
|
+
user = User.create(:status => :active)
|
292
|
+
user.status = :blocked
|
293
|
+
|
294
|
+
expected = ActiveSupport::HashWithIndifferentAccess.new(status: [1, 2]).to_yaml
|
295
|
+
assert_equal expected, user.changes.to_yaml
|
296
|
+
end
|
231
297
|
end
|
data/test/attribute_test.rb
CHANGED
@@ -19,6 +19,17 @@ describe Enumerize::Attribute do
|
|
19
19
|
attr.name.must_equal :foo
|
20
20
|
end
|
21
21
|
|
22
|
+
describe 'i18n scopes' do
|
23
|
+
it 'returns scopes from options' do
|
24
|
+
build_attr nil, 'foo', :in => %w[a b], :i18n_scope => %w[bar buzz]
|
25
|
+
attr.i18n_scopes.must_equal %w[bar buzz]
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'accepts only string scopes' do
|
29
|
+
proc { build_attr nil, 'foo', :in => %w[a b], :i18n_scope => [%w[bar buzz], "bar.buzz"] }.must_raise ArgumentError
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
22
33
|
describe 'options for select' do
|
23
34
|
it 'returns all options for select' do
|
24
35
|
store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
|
@@ -67,4 +78,35 @@ describe Enumerize::Attribute do
|
|
67
78
|
attr.find_value(2).must_equal 'b'
|
68
79
|
end
|
69
80
|
end
|
81
|
+
|
82
|
+
describe 'values hash with zero' do
|
83
|
+
before do
|
84
|
+
build_attr nil, :foo, :in => {:a => 1, :b => 2, :c => 0}
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'returns hash keys as values' do
|
88
|
+
attr.values.must_equal %w[a b c]
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'finds values by hash values' do
|
92
|
+
attr.find_value(1).must_equal 'a'
|
93
|
+
attr.find_value(2).must_equal 'b'
|
94
|
+
attr.find_value(0).must_equal 'c'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe 'boolean values hash' do
|
99
|
+
before do
|
100
|
+
build_attr nil, :foo, :in => {:a => true, :b => false}
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'returns hash keys as values' do
|
104
|
+
attr.values.must_equal %w[a b]
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'finds values by hash values' do
|
108
|
+
attr.find_value(true).must_equal 'a'
|
109
|
+
attr.find_value(false).must_equal 'b'
|
110
|
+
end
|
111
|
+
end
|
70
112
|
end
|
data/test/mongoid_test.rb
CHANGED
@@ -19,6 +19,7 @@ describe Enumerize do
|
|
19
19
|
field :role
|
20
20
|
enumerize :sex, :in => %w[male female]
|
21
21
|
enumerize :role, :in => %w[admin user], :default => 'user'
|
22
|
+
enumerize :mult, :in => %w[one two three four], :multiple => true
|
22
23
|
end
|
23
24
|
|
24
25
|
before { $VERBOSE = nil }
|
@@ -67,4 +68,12 @@ describe Enumerize do
|
|
67
68
|
user.sex = :female
|
68
69
|
user.sex.must_equal 'female'
|
69
70
|
end
|
71
|
+
|
72
|
+
it 'loads multiple properly' do
|
73
|
+
model.delete_all
|
74
|
+
|
75
|
+
model.create!(:mult => ['one', 'two'])
|
76
|
+
user = model.first
|
77
|
+
user.mult.to_a.must_equal ['one', 'two']
|
78
|
+
end
|
70
79
|
end
|
data/test/rails_admin_test.rb
CHANGED
@@ -15,4 +15,11 @@ class RailsAdminSpec < MiniTest::Spec
|
|
15
15
|
object.foo_enum.must_equal [['a text', 'a'], ['b text', 'b']]
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
it 'defines enum properly for custom values enumerations' do
|
20
|
+
store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
|
21
|
+
klass.enumerize(:foo, in: {:a => 1, :b => 2})
|
22
|
+
object.foo_enum.must_equal [['a text', 1], ['b text', 2]]
|
23
|
+
end
|
24
|
+
end
|
18
25
|
end
|
data/test/rspec_matcher_test.rb
CHANGED
@@ -15,6 +15,22 @@ describe Enumerize::Integrations::RSpec do
|
|
15
15
|
let(:should) { Should.new }
|
16
16
|
let(:object) { klass.new }
|
17
17
|
|
18
|
+
describe '#description' do
|
19
|
+
before do
|
20
|
+
klass.enumerize(:sex, :in => [:male, :female])
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'returns description without default value' do
|
24
|
+
matcher = should.enumerize(:sex).in(:male, :female)
|
25
|
+
matcher.description.must_equal 'enumerize :sex in: "female", "male"'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns description with default value' do
|
29
|
+
matcher = should.enumerize(:sex).in(:male, :female).with_default(:male)
|
30
|
+
matcher.description.must_equal 'enumerize :sex in: "female", "male" with "male" as default value'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
18
34
|
describe '#matches?' do
|
19
35
|
before do
|
20
36
|
klass.enumerize(:sex, :in => [:male, :female])
|
@@ -49,5 +65,12 @@ describe Enumerize::Integrations::RSpec do
|
|
49
65
|
expected = ' expected :sex to have "foo" as default value, but it sets "male" instead'
|
50
66
|
matcher.failure_message.must_equal expected
|
51
67
|
end
|
68
|
+
|
69
|
+
it 'returns failure message for ivalid :in option with default value' do
|
70
|
+
matcher = should.enumerize(:sex).in(:bar).with_default(:male)
|
71
|
+
matcher.subject = object
|
72
|
+
expected = ' expected :sex to allow value: "bar", but it allows "female", "male" instead'
|
73
|
+
matcher.failure_message.must_equal expected
|
74
|
+
end
|
52
75
|
end
|
53
76
|
end
|
data/test/simple_form_test.rb
CHANGED
@@ -44,6 +44,15 @@ class SimpleFormSpec < MiniTest::Spec
|
|
44
44
|
let(:user) { User.new }
|
45
45
|
let(:post) { Post.new }
|
46
46
|
|
47
|
+
it 'renders select with enumerized values using input_field' do
|
48
|
+
concat(simple_form_for(user) do |f|
|
49
|
+
f.input_field(:sex)
|
50
|
+
end)
|
51
|
+
|
52
|
+
assert_select 'select option[value=male]'
|
53
|
+
assert_select 'select option[value=female]'
|
54
|
+
end
|
55
|
+
|
47
56
|
it 'renders select with enumerized values' do
|
48
57
|
concat(simple_form_for(user) do |f|
|
49
58
|
f.input(:sex)
|
data/test/value_test.rb
CHANGED
@@ -13,7 +13,7 @@ describe Enumerize::Value do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
describe 'translation' do
|
16
|
-
let(:attr) { Struct.new(:values, :name, :
|
16
|
+
let(:attr) { Struct.new(:values, :name, :i18n_scopes).new([], "attribute_name", []) }
|
17
17
|
|
18
18
|
it 'uses common translation' do
|
19
19
|
store_translations(:en, :enumerize => {:attribute_name => {:test_value => "Common translation"}}) do
|
@@ -22,12 +22,16 @@ describe Enumerize::Value do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'uses model specific translation' do
|
25
|
+
attr.i18n_scopes = ["enumerize.model_name.attribute_name"]
|
26
|
+
|
25
27
|
store_translations(:en, :enumerize => {:model_name => {:attribute_name => {:test_value => "Model Specific translation"}}}) do
|
26
28
|
value.text.must_be :==, "Model Specific translation"
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
30
32
|
it 'uses model specific translation rather than common translation' do
|
33
|
+
attr.i18n_scopes = ["enumerize.model_name.attribute_name"]
|
34
|
+
|
31
35
|
store_translations(:en, :enumerize => {:attribute_name => {:test_value => "Common translation"}, :model_name => {:attribute_name => {:test_value => "Model Specific translation"}}}) do
|
32
36
|
value.text.must_be :==, "Model Specific translation"
|
33
37
|
end
|
@@ -38,6 +42,22 @@ describe Enumerize::Value do
|
|
38
42
|
value.text.must_be :==, "Test value"
|
39
43
|
end
|
40
44
|
end
|
45
|
+
|
46
|
+
it 'uses specified in options translation scope' do
|
47
|
+
attr.i18n_scopes = ["other.scope"]
|
48
|
+
|
49
|
+
store_translations(:en, :other => {:scope => {:test_value => "Scope specific translation"}}) do
|
50
|
+
value.text.must_be :==, "Scope specific translation"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'uses first found translation scope from options' do
|
55
|
+
attr.i18n_scopes = ["nonexistent.scope", "other.scope"]
|
56
|
+
|
57
|
+
store_translations(:en, :other => {:scope => {:test_value => "Scope specific translation"}}) do
|
58
|
+
value.text.must_be :==, "Scope specific translation"
|
59
|
+
end
|
60
|
+
end
|
41
61
|
end
|
42
62
|
|
43
63
|
describe 'boolean methods comparison' do
|
@@ -78,4 +98,10 @@ describe Enumerize::Value do
|
|
78
98
|
value.wont_respond_to :some_method?
|
79
99
|
end
|
80
100
|
end
|
101
|
+
|
102
|
+
describe 'serialization' do
|
103
|
+
it 'should be serialized to yaml as string value' do
|
104
|
+
assert_equal YAML.dump('test_value'), YAML.dump(value)
|
105
|
+
end
|
106
|
+
end
|
81
107
|
end
|
metadata
CHANGED
@@ -1,32 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumerize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.8.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Sergey Nartimov
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-04 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.2'
|
20
|
-
none: false
|
21
20
|
type: :runtime
|
21
|
+
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.2'
|
27
|
-
none: false
|
28
|
-
prerelease: false
|
29
|
-
name: activesupport
|
30
27
|
description: Enumerated attributes with I18n and ActiveRecord/Mongoid/MongoMapper
|
31
28
|
support
|
32
29
|
email: team@brainspec.com
|
@@ -34,8 +31,8 @@ executables: []
|
|
34
31
|
extensions: []
|
35
32
|
extra_rdoc_files: []
|
36
33
|
files:
|
37
|
-
- .gitignore
|
38
|
-
- .travis.yml
|
34
|
+
- ".gitignore"
|
35
|
+
- ".travis.yml"
|
39
36
|
- CHANGELOG.md
|
40
37
|
- Gemfile
|
41
38
|
- Gemfile.rails4
|
@@ -51,6 +48,7 @@ files:
|
|
51
48
|
- lib/enumerize/form_helper.rb
|
52
49
|
- lib/enumerize/hooks/formtastic.rb
|
53
50
|
- lib/enumerize/hooks/simple_form.rb
|
51
|
+
- lib/enumerize/hooks/uniqueness.rb
|
54
52
|
- lib/enumerize/integrations/rails_admin.rb
|
55
53
|
- lib/enumerize/integrations/rspec.rb
|
56
54
|
- lib/enumerize/integrations/rspec/matcher.rb
|
@@ -82,29 +80,25 @@ files:
|
|
82
80
|
- test/value_test.rb
|
83
81
|
homepage: https://github.com/brainspec/enumerize
|
84
82
|
licenses: []
|
83
|
+
metadata: {}
|
85
84
|
post_install_message:
|
86
85
|
rdoc_options: []
|
87
86
|
require_paths:
|
88
87
|
- lib
|
89
88
|
required_ruby_version: !ruby/object:Gem::Requirement
|
90
89
|
requirements:
|
91
|
-
- -
|
90
|
+
- - ">="
|
92
91
|
- !ruby/object:Gem::Version
|
93
92
|
version: 1.9.3
|
94
|
-
none: false
|
95
93
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
94
|
requirements:
|
97
|
-
- -
|
95
|
+
- - ">="
|
98
96
|
- !ruby/object:Gem::Version
|
99
|
-
hash: 2859816307703102675
|
100
97
|
version: '0'
|
101
|
-
segments:
|
102
|
-
- 0
|
103
|
-
none: false
|
104
98
|
requirements: []
|
105
99
|
rubyforge_project:
|
106
|
-
rubygems_version:
|
100
|
+
rubygems_version: 2.2.0
|
107
101
|
signing_key:
|
108
|
-
specification_version:
|
102
|
+
specification_version: 4
|
109
103
|
summary: Enumerated attributes with I18n and ActiveRecord/Mongoid/MongoMapper support
|
110
104
|
test_files: []
|