active_enum 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +7 -0
- data/README.rdoc +7 -7
- data/active_enum.gemspec +2 -2
- data/lib/active_enum.rb +1 -5
- data/lib/active_enum/base.rb +3 -3
- data/lib/active_enum/extensions.rb +29 -26
- data/lib/active_enum/form_helpers/formtastic.rb +3 -3
- data/lib/active_enum/form_helpers/simple_form.rb +4 -2
- data/lib/active_enum/version.rb +1 -1
- data/spec/active_enum/extensions_spec.rb +13 -6
- data/spec/active_enum/form_helpers/formtastic_spec.rb +7 -0
- data/spec/active_enum/form_helpers/simple_form_spec.rb +7 -0
- data/spec/spec_helper.rb +5 -0
- metadata +4 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
[0.8.2] : 2010-08-01
|
2
|
+
- Fix method name clash of enum_for which is defined on Object
|
3
|
+
- Refactor extension method definitions
|
4
|
+
|
5
|
+
[0.8.1] : 2010-07-19
|
6
|
+
- Enumerated attribute read method can access meta data using key as argument
|
7
|
+
|
1
8
|
[0.8.0] : 2010-07-19
|
2
9
|
- Added pluggable storage API
|
3
10
|
- Added memory store as default storage
|
data/README.rdoc
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
Define enum classes in Rails and use them to enumerate ActiveRecord attributes. Brings together some ideas
|
4
4
|
of similar plugins that I liked and does it they way I prefer.
|
5
5
|
|
6
|
-
Enum values are stored in memory at the moment but I plan to add database and
|
6
|
+
Enum values are stored in memory at the moment but I plan to add database and possibly others.
|
7
7
|
|
8
8
|
== Install
|
9
9
|
|
@@ -135,7 +135,7 @@ You can check if the attribute value matches a particular enum value by passing
|
|
135
135
|
|
136
136
|
A convenience method on the class is available to the enum class of any enumerated attribute
|
137
137
|
|
138
|
-
User.
|
138
|
+
User.active_enum_for(:sex) # => Sex
|
139
139
|
|
140
140
|
=== Bulk definition
|
141
141
|
|
@@ -163,15 +163,15 @@ All defined enum classes are stored in ActiveEnum.enum_classes array if you need
|
|
163
163
|
|
164
164
|
You can make an existing model class behave like an enum class with acts_as_enum
|
165
165
|
|
166
|
-
class
|
167
|
-
acts_as_enum :name_column => '
|
166
|
+
class Country < ActiveRecord::Base
|
167
|
+
acts_as_enum :name_column => 'short_name'
|
168
168
|
end
|
169
169
|
|
170
170
|
Giving you the familiar enum methods
|
171
171
|
|
172
|
-
|
173
|
-
|
174
|
-
|
172
|
+
Country[1]
|
173
|
+
Country['Australia']
|
174
|
+
Country.to_select
|
175
175
|
|
176
176
|
|
177
177
|
=== Form Helpers
|
data/active_enum.gemspec
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{active_enum}
|
5
|
-
s.version = "0.8.
|
5
|
+
s.version = "0.8.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Adam Meehan"]
|
9
9
|
s.autorequire = %q{active_enum}
|
10
|
-
s.date = %q{2010-
|
10
|
+
s.date = %q{2010-08-01}
|
11
11
|
s.description = %q{Define enum classes in Rails and use them to enumerate ActiveRecord attributes}
|
12
12
|
s.email = %q{adam.meehan@gmail.com}
|
13
13
|
s.extra_rdoc_files = ["README.rdoc"]
|
data/lib/active_enum.rb
CHANGED
@@ -17,11 +17,7 @@ module ActiveEnum
|
|
17
17
|
class Configuration
|
18
18
|
def enum(name, &block)
|
19
19
|
class_name = name.to_s.camelize
|
20
|
-
|
21
|
-
class #{class_name} < ActiveEnum::Base
|
22
|
-
end
|
23
|
-
end_eval
|
24
|
-
eval(class_def, TOPLEVEL_BINDING)
|
20
|
+
eval("class #{class_name} < ActiveEnum::Base; end", TOPLEVEL_BINDING)
|
25
21
|
new_enum = Module.const_get(class_name)
|
26
22
|
new_enum.class_eval(&block)
|
27
23
|
end
|
data/lib/active_enum/base.rb
CHANGED
@@ -50,7 +50,7 @@ module ActiveEnum
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
def
|
53
|
+
def active_enum_for(attribute)
|
54
54
|
self.enumerated_attributes[attribute.to_sym]
|
55
55
|
end
|
56
56
|
|
@@ -63,24 +63,26 @@ module ActiveEnum
|
|
63
63
|
# user.sex(:meta_key)
|
64
64
|
#
|
65
65
|
def define_active_enum_read_method(attribute)
|
66
|
-
|
67
|
-
arg
|
68
|
-
|
69
|
-
|
66
|
+
class_eval <<-DEF
|
67
|
+
def #{attribute}(arg=nil)
|
68
|
+
value = super()
|
69
|
+
return if value.nil? && arg.nil?
|
70
70
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
enum
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
71
|
+
enum = self.class.active_enum_for(:#{attribute})
|
72
|
+
case arg
|
73
|
+
when :id
|
74
|
+
value if enum[value]
|
75
|
+
when :name
|
76
|
+
enum[value]
|
77
|
+
when :enum
|
78
|
+
enum
|
79
|
+
when Symbol
|
80
|
+
(enum.meta(value) || {})[arg]
|
81
|
+
else
|
82
|
+
#{ActiveEnum.use_name_as_value ? 'enum[value]' : 'value' }
|
83
|
+
end
|
82
84
|
end
|
83
|
-
|
85
|
+
DEF
|
84
86
|
end
|
85
87
|
|
86
88
|
# Define write method to also handle enum value
|
@@ -89,15 +91,16 @@ module ActiveEnum
|
|
89
91
|
# user.sex = :male
|
90
92
|
#
|
91
93
|
def define_active_enum_write_method(attribute)
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
94
|
+
class_eval <<-DEF
|
95
|
+
def #{attribute}=(arg)
|
96
|
+
if arg.is_a?(Symbol)
|
97
|
+
value = self.class.active_enum_for(:#{attribute})[arg]
|
98
|
+
super(value)
|
99
|
+
else
|
100
|
+
super(arg)
|
101
|
+
end
|
99
102
|
end
|
100
|
-
|
103
|
+
DEF
|
101
104
|
end
|
102
105
|
|
103
106
|
# Define question method to check enum value against attribute value
|
@@ -108,7 +111,7 @@ module ActiveEnum
|
|
108
111
|
define_method("#{attribute}?") do |*arg|
|
109
112
|
arg = arg.first
|
110
113
|
if arg
|
111
|
-
send(attribute) == self.class.
|
114
|
+
send(attribute) == self.class.active_enum_for(attribute)[arg]
|
112
115
|
else
|
113
116
|
super
|
114
117
|
end
|
@@ -6,12 +6,12 @@ module ActiveEnum
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def default_input_type_with_active_enum(method, options)
|
9
|
-
return :enum if @object.class.
|
10
|
-
default_input_type_without_active_enum
|
9
|
+
return :enum if @object.class.respond_to?(:active_enum_for) && @object.class.active_enum_for(method)
|
10
|
+
default_input_type_without_active_enum(method, options)
|
11
11
|
end
|
12
12
|
|
13
13
|
def enum_input(method, options)
|
14
|
-
raise "Attribute '#{method}' has no enum class" unless enum = @object.class.
|
14
|
+
raise "Attribute '#{method}' has no enum class" unless enum = @object.class.active_enum_for(method)
|
15
15
|
select_input(method, options.merge(:collection => enum.to_select))
|
16
16
|
end
|
17
17
|
|
@@ -7,7 +7,9 @@ module ActiveEnum
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def default_input_type_with_active_enum
|
10
|
-
return :enum if @options[:as].nil? &&
|
10
|
+
return :enum if @options[:as].nil? &&
|
11
|
+
object.class.respond_to?(:active_enum_for) &&
|
12
|
+
object.class.active_enum_for(attribute_name)
|
11
13
|
default_input_type_without_active_enum
|
12
14
|
end
|
13
15
|
end
|
@@ -16,7 +18,7 @@ module ActiveEnum
|
|
16
18
|
|
17
19
|
def initialize(builder)
|
18
20
|
super
|
19
|
-
raise "Attribute '#{attribute_name}' has no enum class" unless enum = object.class.
|
21
|
+
raise "Attribute '#{attribute_name}' has no enum class" unless enum = object.class.active_enum_for(attribute_name)
|
20
22
|
builder.options[:collection] = enum.to_select
|
21
23
|
end
|
22
24
|
|
data/lib/active_enum/version.rb
CHANGED
@@ -17,23 +17,23 @@ describe ActiveEnum::Extensions do
|
|
17
17
|
ActiveRecord::Base.should respond_to(:enumerate)
|
18
18
|
end
|
19
19
|
|
20
|
-
it 'should add class :
|
21
|
-
ActiveRecord::Base.should respond_to(:
|
20
|
+
it 'should add class :active_enum_for method to ActiveRecord' do
|
21
|
+
ActiveRecord::Base.should respond_to(:active_enum_for)
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'should allow multiple attributes to be enumerated with same enum' do
|
25
25
|
Person.class_eval do
|
26
26
|
enumerate :attending, :staying, :with => Accepted
|
27
27
|
end
|
28
|
-
Person.
|
29
|
-
Person.
|
28
|
+
Person.active_enum_for(:attending).should == Accepted
|
29
|
+
Person.active_enum_for(:staying).should == Accepted
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'should allow implicit enumeration class from attribute name' do
|
33
33
|
Person.class_eval do
|
34
34
|
enumerate :sex
|
35
35
|
end
|
36
|
-
Person.
|
36
|
+
Person.active_enum_for(:sex).should == Sex
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'should create enum namespaced enum class from block' do
|
@@ -42,7 +42,7 @@ describe ActiveEnum::Extensions do
|
|
42
42
|
value :id => 1, :name => 'Male'
|
43
43
|
end
|
44
44
|
end
|
45
|
-
Person.
|
45
|
+
Person.active_enum_for(:sex).should == ::Person::Sex
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'should raise error if implicit enumeration class cannot be found' do
|
@@ -198,6 +198,13 @@ describe ActiveEnum::Extensions do
|
|
198
198
|
ActiveEnum.use_name_as_value = true
|
199
199
|
end
|
200
200
|
|
201
|
+
before do
|
202
|
+
reset_class Person do
|
203
|
+
enumerate :sex, :with => Sex
|
204
|
+
end
|
205
|
+
@person = Person.new(:sex =>1)
|
206
|
+
end
|
207
|
+
|
201
208
|
it 'should return text name value for attribute' do
|
202
209
|
@person.sex.should == 'Male'
|
203
210
|
end
|
@@ -38,6 +38,13 @@ describe 'ActiveEnum::FormHelpers::Formtastic' do
|
|
38
38
|
}.should raise_error "Attribute 'attending' has no enum class"
|
39
39
|
end
|
40
40
|
|
41
|
+
it "should not use enum input type if class does not support ActiveEnum" do
|
42
|
+
output = semantic_form_for(:not_active_record, NotActiveRecord.new, :url => people_path) do |f|
|
43
|
+
concat f.input(:name)
|
44
|
+
end
|
45
|
+
output.should have_selector('input#not_active_record_name')
|
46
|
+
end
|
47
|
+
|
41
48
|
def people_path
|
42
49
|
'/people'
|
43
50
|
end
|
@@ -39,6 +39,13 @@ describe 'ActiveEnum::FormHelpers::Simple' do
|
|
39
39
|
}.should raise_error(StandardError, "Attribute 'attending' has no enum class")
|
40
40
|
end
|
41
41
|
|
42
|
+
it "should not use enum input type if class does not support ActiveEnum" do
|
43
|
+
output = simple_form_for(:not_active_record, NotActiveRecord.new, :url => people_path) do |f|
|
44
|
+
concat f.input(:name)
|
45
|
+
end
|
46
|
+
output.should have_selector('input#not_active_record_name')
|
47
|
+
end
|
48
|
+
|
42
49
|
def people_path
|
43
50
|
'/people'
|
44
51
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_enum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 59
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 8
|
9
|
-
-
|
10
|
-
version: 0.8.
|
9
|
+
- 2
|
10
|
+
version: 0.8.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Adam Meehan
|
@@ -15,7 +15,7 @@ autorequire: active_enum
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-08-01 00:00:00 +10:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|