enumerize 0.3.0 → 0.4.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.
- data/.travis.yml +7 -4
- data/CHANGELOG.md +13 -0
- data/Gemfile +2 -1
- data/README.md +33 -0
- data/enumerize.gemspec +1 -1
- data/lib/enumerize.rb +3 -0
- data/lib/enumerize/base.rb +1 -5
- data/lib/enumerize/hooks/formtastic.rb +1 -5
- data/lib/enumerize/predicates.rb +72 -0
- data/lib/enumerize/value.rb +7 -8
- data/lib/enumerize/version.rb +1 -1
- data/test/formtastic_test.rb +7 -13
- data/test/mongoid_test.rb +1 -1
- data/test/predicates_test.rb +44 -0
- data/test/value_test.rb +4 -0
- metadata +9 -7
- data/gemfiles/Gemfile-ar-3.1.x +0 -13
data/.travis.yml
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
language: ruby
|
2
|
+
services:
|
3
|
+
- mongodb
|
2
4
|
before_install:
|
3
5
|
- gem install bundler
|
4
6
|
rvm:
|
5
|
-
- 1.9.2
|
6
7
|
- 1.9.3
|
7
|
-
|
8
|
-
-
|
9
|
-
|
8
|
+
- jruby-19mode
|
9
|
+
- rbx-19mode
|
10
|
+
matrix:
|
11
|
+
allow_failures:
|
12
|
+
- rvm: jruby-19mode
|
10
13
|
notifications:
|
11
14
|
email:
|
12
15
|
recipients:
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
## 0.4.0 (September 6, 2012) ##
|
2
|
+
|
3
|
+
Legacy support was dropped. The following versions are supported:
|
4
|
+
|
5
|
+
* Ruby 1.9.3+ (including JRuby and Rubinius)
|
6
|
+
* Rails 3.2+
|
7
|
+
* Formtastic 2.2+
|
8
|
+
* SimpleForm 2+
|
9
|
+
* Mongoid 3+
|
10
|
+
|
11
|
+
### enchancements
|
12
|
+
* Ability to define predicate methods on enumerized object. (by [@lest](https://github.com/lest))
|
13
|
+
|
1
14
|
## 0.3.0 (July 9, 2012) ##
|
2
15
|
|
3
16
|
### enhancements
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -101,6 +101,39 @@ user.sex.male? #=> true
|
|
101
101
|
user.sex.female? #=> false
|
102
102
|
```
|
103
103
|
|
104
|
+
Predicate methods:
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
class User
|
108
|
+
include Enumerize
|
109
|
+
enumerize :sex, in: %w(male female), predicates: true
|
110
|
+
end
|
111
|
+
|
112
|
+
user = User.new
|
113
|
+
|
114
|
+
user.male? # => false
|
115
|
+
user.female? # => false
|
116
|
+
|
117
|
+
user.sex = 'male'
|
118
|
+
|
119
|
+
user.male? # => true
|
120
|
+
user.female? # => false
|
121
|
+
```
|
122
|
+
|
123
|
+
Using prefix:
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
class User
|
127
|
+
include Enumerize
|
128
|
+
enumerize :sex, in: %w(male female), predicates: { prefix: true }
|
129
|
+
end
|
130
|
+
|
131
|
+
user = User.new
|
132
|
+
user.sex = 'female'
|
133
|
+
user.sex_female? # => true
|
134
|
+
```
|
135
|
+
Use `:only` and `:except` options to specify what values create predicate methods for.
|
136
|
+
|
104
137
|
To make some attributes shared across different classes it's possible to define them in a separate module and then include it into classes:
|
105
138
|
|
106
139
|
```ruby
|
data/enumerize.gemspec
CHANGED
data/lib/enumerize.rb
CHANGED
@@ -7,10 +7,13 @@ module Enumerize
|
|
7
7
|
autoload :Value, 'enumerize/value'
|
8
8
|
autoload :Base, 'enumerize/base'
|
9
9
|
autoload :ActiveRecord, 'enumerize/activerecord'
|
10
|
+
autoload :Predicates, 'enumerize/predicates'
|
10
11
|
autoload :ModuleAttributes, 'enumerize/module_attributes'
|
11
12
|
|
12
13
|
def self.included(base)
|
13
14
|
base.send :include, Enumerize::Base
|
15
|
+
base.extend Enumerize::Predicates
|
16
|
+
|
14
17
|
if defined?(::ActiveRecord::Base) && base < ::ActiveRecord::Base
|
15
18
|
base.extend Enumerize::ActiveRecord
|
16
19
|
end
|
data/lib/enumerize/base.rb
CHANGED
@@ -26,7 +26,7 @@ module Enumerize
|
|
26
26
|
RUBY
|
27
27
|
|
28
28
|
if respond_to?(:validates)
|
29
|
-
validates name, :inclusion => {:in => enumerized_attributes[name].values
|
29
|
+
validates name, :inclusion => { :in => enumerized_attributes[name].values, :allow_nil => true, :allow_blank => true }
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -60,8 +60,6 @@ module Enumerize
|
|
60
60
|
def #{attr.name}
|
61
61
|
if defined?(super)
|
62
62
|
self.class.enumerized_attributes[:#{attr.name}].find_value(super)
|
63
|
-
elsif respond_to?(:read_attribute, true)
|
64
|
-
self.class.enumerized_attributes[:#{attr.name}].find_value(read_attribute(:#{attr.name}))
|
65
63
|
else
|
66
64
|
if defined?(@#{attr.name})
|
67
65
|
self.class.enumerized_attributes[:#{attr.name}].find_value(@#{attr.name})
|
@@ -79,8 +77,6 @@ module Enumerize
|
|
79
77
|
|
80
78
|
if defined?(super)
|
81
79
|
super allowed_value_or_nil
|
82
|
-
elsif respond_to?(:write_attribute, true)
|
83
|
-
write_attribute :#{attr.name}, allowed_value_or_nil
|
84
80
|
else
|
85
81
|
@#{attr.name} = allowed_value_or_nil
|
86
82
|
end
|
@@ -21,8 +21,4 @@ module Enumerize
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
::Formtastic::SemanticFormBuilder.send :include, Enumerize::Hooks::FormtasticFormBuilderExtension
|
26
|
-
else
|
27
|
-
::Formtastic::FormBuilder.send :include, Enumerize::Hooks::FormtasticFormBuilderExtension
|
28
|
-
end
|
24
|
+
::Formtastic::FormBuilder.send :include, Enumerize::Hooks::FormtasticFormBuilderExtension
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Enumerize
|
2
|
+
# Predicate methods.
|
3
|
+
#
|
4
|
+
# Basic usage:
|
5
|
+
#
|
6
|
+
# class User
|
7
|
+
# include Enumerize
|
8
|
+
# enumerize :sex, in: %w(male female), predicates: true
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# user = User.new
|
12
|
+
#
|
13
|
+
# user.male? # => false
|
14
|
+
# user.female? # => false
|
15
|
+
#
|
16
|
+
# user.sex = 'male'
|
17
|
+
#
|
18
|
+
# user.male? # => true
|
19
|
+
# user.female? # => false
|
20
|
+
#
|
21
|
+
# Using prefix:
|
22
|
+
#
|
23
|
+
# class User
|
24
|
+
# include Enumerize
|
25
|
+
# enumerize :sex, in: %w(male female), predicates: { prefix: true }
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# user = User.new
|
29
|
+
# user.sex = 'female'
|
30
|
+
# user.sex_female? # => true
|
31
|
+
#
|
32
|
+
# Use <tt>only</tt> and <tt>except</tt> options to specify what values create
|
33
|
+
# predicate methods for.
|
34
|
+
module Predicates
|
35
|
+
def enumerize(name, options={})
|
36
|
+
super
|
37
|
+
|
38
|
+
if options[:predicates]
|
39
|
+
Builder.new(enumerized_attributes[name], options[:predicates]).build(self)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Builder
|
44
|
+
def initialize(attr, options)
|
45
|
+
@attr = attr
|
46
|
+
@options = options.is_a?(Hash) ? options : {}
|
47
|
+
end
|
48
|
+
|
49
|
+
def values
|
50
|
+
values = @attr.values
|
51
|
+
|
52
|
+
if @options[:only]
|
53
|
+
values &= Array(@options[:only]).map(&:to_s)
|
54
|
+
end
|
55
|
+
|
56
|
+
if @options[:except]
|
57
|
+
values -= Array(@options[:except]).map(&:to_s)
|
58
|
+
end
|
59
|
+
|
60
|
+
values
|
61
|
+
end
|
62
|
+
|
63
|
+
def names
|
64
|
+
values.map { |v| "#{v}?" }
|
65
|
+
end
|
66
|
+
|
67
|
+
def build(klass)
|
68
|
+
klass.delegate(*names, to: @attr.name, prefix: @options[:prefix], allow_nil: true)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/enumerize/value.rb
CHANGED
@@ -18,7 +18,7 @@ module Enumerize
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def method_missing(method, *args, &block)
|
21
|
-
if
|
21
|
+
if boolean_method?(method)
|
22
22
|
define_query_methods
|
23
23
|
send(method, *args, &block)
|
24
24
|
else
|
@@ -26,13 +26,8 @@ module Enumerize
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
|
31
|
-
true
|
32
|
-
elsif method[-1] == '?' && @attr.values.include?(method[0..-2])
|
33
|
-
define_query_methods
|
34
|
-
super
|
35
|
-
end
|
29
|
+
def respond_to_missing?(method, include_private=false)
|
30
|
+
boolean_method?(method)
|
36
31
|
end
|
37
32
|
|
38
33
|
private
|
@@ -65,5 +60,9 @@ module Enumerize
|
|
65
60
|
def i18n_suffix
|
66
61
|
"#{@attr.i18n_suffix}." if @attr.i18n_suffix
|
67
62
|
end
|
63
|
+
|
64
|
+
def boolean_method?(method)
|
65
|
+
method[-1] == '?' && @attr.values.include?(method[0..-2])
|
66
|
+
end
|
68
67
|
end
|
69
68
|
end
|
data/lib/enumerize/version.rb
CHANGED
data/test/formtastic_test.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
module
|
5
|
-
module
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
input_class_with_const_defined(as)
|
10
|
-
end
|
3
|
+
module Formtastic
|
4
|
+
module Helpers
|
5
|
+
module InputHelper
|
6
|
+
remove_method :input_class
|
7
|
+
def input_class(as)
|
8
|
+
input_class_with_const_defined(as)
|
11
9
|
end
|
12
10
|
end
|
13
11
|
end
|
@@ -15,11 +13,7 @@ end
|
|
15
13
|
|
16
14
|
class FormtasticSpec < MiniTest::Spec
|
17
15
|
include ViewTestHelper
|
18
|
-
|
19
|
-
include Formtastic::SemanticFormHelper
|
20
|
-
else
|
21
|
-
include Formtastic::Helpers::FormHelper
|
22
|
-
end
|
16
|
+
include Formtastic::Helpers::FormHelper
|
23
17
|
|
24
18
|
class User < Struct.new(:sex, :age)
|
25
19
|
extend ActiveModel::Naming
|
data/test/mongoid_test.rb
CHANGED
@@ -5,7 +5,7 @@ silence_warnings do
|
|
5
5
|
end
|
6
6
|
|
7
7
|
Mongoid.configure do |config|
|
8
|
-
config.
|
8
|
+
config.sessions = { :default => { :database => 'enumerize-test-suite', hosts: ['127.0.0.1:27017'] } }
|
9
9
|
config.use_utc = true
|
10
10
|
config.include_root_in_json = true
|
11
11
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe Enumerize::Predicates do
|
4
|
+
let(:klass) do
|
5
|
+
Class.new do
|
6
|
+
include Enumerize
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:object) { klass.new }
|
11
|
+
|
12
|
+
it 'creates predicate methods' do
|
13
|
+
klass.enumerize(:foo, in: %w(a b), predicates: true)
|
14
|
+
object.must_respond_to :a?
|
15
|
+
object.must_respond_to :b?
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'checks values' do
|
19
|
+
klass.enumerize(:foo, in: %w(a b), predicates: true)
|
20
|
+
object.foo = 'a'
|
21
|
+
object.a?.must_equal true
|
22
|
+
object.b?.must_equal false
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'prefixes methods' do
|
26
|
+
klass.enumerize(:foo, in: %w(a b), predicates: { prefix: 'bar' })
|
27
|
+
object.wont_respond_to :a?
|
28
|
+
object.wont_respond_to :b?
|
29
|
+
object.must_respond_to :bar_a?
|
30
|
+
object.must_respond_to :bar_b?
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'accepts only option' do
|
34
|
+
klass.enumerize(:foo, in: %w(a b), predicates: { only: :a })
|
35
|
+
object.must_respond_to :a?
|
36
|
+
object.wont_respond_to :b?
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'accepts except option' do
|
40
|
+
klass.enumerize(:foo, in: %w(a b), predicates: { except: :a })
|
41
|
+
object.wont_respond_to :a?
|
42
|
+
object.must_respond_to :b?
|
43
|
+
end
|
44
|
+
end
|
data/test/value_test.rb
CHANGED
@@ -42,6 +42,10 @@ describe Enumerize::Value do
|
|
42
42
|
value.must_respond_to :other_value?
|
43
43
|
end
|
44
44
|
|
45
|
+
it 'returns a method object' do
|
46
|
+
value.method(:test_value?).must_be_instance_of Method
|
47
|
+
end
|
48
|
+
|
45
49
|
it "doesn't respond to a method for not existing value" do
|
46
50
|
value.wont_respond_to :some_method?
|
47
51
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumerize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 3.
|
21
|
+
version: '3.2'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 3.
|
29
|
+
version: '3.2'
|
30
30
|
description: Enumerated attributes with I18n and ActiveRecord/Mongoid support
|
31
31
|
email: team@brainspec.com
|
32
32
|
executables: []
|
@@ -41,7 +41,6 @@ files:
|
|
41
41
|
- README.md
|
42
42
|
- Rakefile
|
43
43
|
- enumerize.gemspec
|
44
|
-
- gemfiles/Gemfile-ar-3.1.x
|
45
44
|
- lib/enumerize.rb
|
46
45
|
- lib/enumerize/activerecord.rb
|
47
46
|
- lib/enumerize/attribute.rb
|
@@ -50,6 +49,7 @@ files:
|
|
50
49
|
- lib/enumerize/hooks/formtastic.rb
|
51
50
|
- lib/enumerize/hooks/simple_form.rb
|
52
51
|
- lib/enumerize/module_attributes.rb
|
52
|
+
- lib/enumerize/predicates.rb
|
53
53
|
- lib/enumerize/value.rb
|
54
54
|
- lib/enumerize/version.rb
|
55
55
|
- test/activerecord_test.rb
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- test/formtastic_test.rb
|
60
60
|
- test/module_attributes_test.rb
|
61
61
|
- test/mongoid_test.rb
|
62
|
+
- test/predicates_test.rb
|
62
63
|
- test/simple_form_test.rb
|
63
64
|
- test/support/mock_controller.rb
|
64
65
|
- test/support/view_test_helper.rb
|
@@ -78,7 +79,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
78
79
|
version: '0'
|
79
80
|
segments:
|
80
81
|
- 0
|
81
|
-
hash:
|
82
|
+
hash: 1785538232513352876
|
82
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
84
|
none: false
|
84
85
|
requirements:
|
@@ -87,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
88
|
version: '0'
|
88
89
|
segments:
|
89
90
|
- 0
|
90
|
-
hash:
|
91
|
+
hash: 1785538232513352876
|
91
92
|
requirements: []
|
92
93
|
rubyforge_project:
|
93
94
|
rubygems_version: 1.8.23
|
@@ -102,6 +103,7 @@ test_files:
|
|
102
103
|
- test/formtastic_test.rb
|
103
104
|
- test/module_attributes_test.rb
|
104
105
|
- test/mongoid_test.rb
|
106
|
+
- test/predicates_test.rb
|
105
107
|
- test/simple_form_test.rb
|
106
108
|
- test/support/mock_controller.rb
|
107
109
|
- test/support/view_test_helper.rb
|
data/gemfiles/Gemfile-ar-3.1.x
DELETED