active_enum 0.8.1 → 0.8.2
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/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
|
|