active_enum 0.6.6 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,13 +7,13 @@ Enum values are stored in memory at the moment but I plan to add database and ya
7
7
 
8
8
  == Install
9
9
 
10
- For Rails 2.x only
10
+ From version 0.7 onwards this plugin will only have Rails 3 support. If you need Rails 2 compatibility, check the 0.6 branch.
11
11
 
12
- gem install active_enum --version '~> 0.6.0'
12
+ gem install active_enum
13
13
 
14
- And add to your Rails environment.rb
14
+ Put this in your Gemfile
15
15
 
16
- config.gem 'active_enum', :version => '~> 0.6.0'
16
+ gem 'active_enum'
17
17
 
18
18
 
19
19
  == Example
@@ -124,7 +124,7 @@ You can check if the attribute value matches a particular enum value by passing
124
124
 
125
125
  A convenience method on the class is available to the enum class of any enumerated attribute
126
126
 
127
- User.active_enum_for(:sex) # => Sex
127
+ User.enum_for(:sex) # => Sex
128
128
 
129
129
  === Bulk definition
130
130
 
@@ -162,21 +162,36 @@ Giving you the familiar enum methods
162
162
  User['Dave']
163
163
  User.to_select
164
164
 
165
- === Formtastic
166
165
 
167
- If you are a formtastic user you can use the extension for an enum input.
166
+ === Form Helpers
167
+
168
+ There is support for Formtastic[http://github.com/justinfrench/formtastic] and SimpleForm[http://github.com/plataformatec/simple_form]
169
+ to make it easier to use the enum values as select options. The plugins have an almost identical API which is handy.
170
+ Instructions for each are below.
171
+
172
+ ==== Formtastic
168
173
 
169
174
  In an initialiser:
170
175
 
171
- require 'active_enum/formtastic'
176
+ require 'active_enum/form_helpers/formtastic'
172
177
 
173
- Then in a form you can use the :enum type for attribute inputs which are enumerated.
178
+ Then declare the input for an enumerated attribute as the :enum type.
174
179
 
175
180
  <% semantic_form_for(@person) do |f| %>
176
181
  <%= f.input :sex, :as => :enum %>
177
182
  <% end %>
178
183
 
179
- This will output a select with the option values taken from the enum class for the attribute.
184
+ ==== SimpleForm
185
+
186
+ In an initialiser:
187
+
188
+ require 'active_enum/form_helpers/simple_form'
189
+
190
+ Then declare the input for an enumerated attribute as the :enum type.
191
+
192
+ <% simple_form_for(@person) do |f| %>
193
+ <%= f.input :sex, :as => :enum %>
194
+ <% end %>
180
195
 
181
196
 
182
197
  == TODO
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'rake/rdoctask'
3
3
  require 'rake/gempackagetask'
4
4
  require 'rubygems/specification'
5
- require 'spec/rake/spectask'
5
+ require 'rspec/core/rake_task'
6
6
  require 'lib/active_enum/version'
7
7
 
8
8
  GEM_NAME = "active_enum"
@@ -29,19 +29,15 @@ end
29
29
  desc 'Default: run specs.'
30
30
  task :default => :spec
31
31
 
32
- spec_files = Rake::FileList["spec/**/*_spec.rb"]
33
-
34
32
  desc "Run specs"
35
- Spec::Rake::SpecTask.new do |t|
36
- t.spec_files = spec_files
37
- t.spec_opts = ["-c"]
33
+ RSpec::Core::RakeTask.new do |t|
34
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
38
35
  end
39
36
 
40
37
  desc "Generate code coverage"
41
- Spec::Rake::SpecTask.new(:coverage) do |t|
42
- t.spec_files = spec_files
38
+ RSpec::Core::RakeTask.new(:coverage) do |t|
43
39
  t.rcov = true
44
- t.rcov_opts = ['--exclude', 'spec,/var/lib/gems']
40
+ t.rcov_opts = ['--exclude', 'spec']
45
41
  end
46
42
 
47
43
  desc 'Generate documentation for plugin.'
@@ -12,10 +12,9 @@ module ActiveEnum
12
12
  extend ClassMethods
13
13
  class_inheritable_accessor :active_enum_options
14
14
  self.active_enum_options = options.reverse_merge(:name_column => 'name')
15
- named_scope :enum_values,
16
- :select => "#{primary_key}, #{active_enum_options[:name_column]}",
17
- :conditions => active_enum_options[:conditions],
18
- :order => "#{primary_key} #{active_enum_options[:order]}"
15
+ scope :enum_values, select("#{primary_key}, #{active_enum_options[:name_column]}").
16
+ where(active_enum_options[:conditions]).
17
+ order("#{primary_key} #{active_enum_options[:order]}")
19
18
  end
20
19
 
21
20
  end
@@ -51,7 +50,7 @@ module ActiveEnum
51
50
  end
52
51
 
53
52
  def lookup_by_name(index)
54
- enum_values.find(:first, :conditions => ["#{active_enum_options[:name_column]} like ?", index.to_s])
53
+ enum_values.where("#{active_enum_options[:name_column]} like ?", index.to_s).first
55
54
  end
56
55
 
57
56
  end
@@ -50,7 +50,7 @@ module ActiveEnum
50
50
  end
51
51
  end
52
52
 
53
- def active_enum_for(attribute)
53
+ def enum_for(attribute)
54
54
  self.enumerated_attributes[attribute.to_sym]
55
55
  end
56
56
 
@@ -62,13 +62,11 @@ module ActiveEnum
62
62
  # user.sex(:enum)
63
63
  #
64
64
  def define_active_enum_read_method(attribute)
65
- define_read_method(attribute, attribute.to_s, columns_hash[attribute.to_s]) unless instance_method_already_implemented?(attribute.to_s)
66
- old_method = "#{attribute}_without_enum"
67
- define_method("#{attribute}_with_enum") do |*arg|
65
+ define_method("#{attribute}") do |*arg|
68
66
  arg = arg.first
69
- value = send(old_method)
67
+ value = super()
70
68
 
71
- enum = self.class.active_enum_for(attribute)
69
+ enum = self.class.enum_for(attribute)
72
70
  case arg
73
71
  when :id
74
72
  value if enum[value]
@@ -80,8 +78,6 @@ module ActiveEnum
80
78
  ActiveEnum.use_name_as_value ? enum[value] : value
81
79
  end
82
80
  end
83
-
84
- alias_method_chain attribute, :enum
85
81
  end
86
82
 
87
83
  # Define write method to also handle enum value
@@ -90,19 +86,15 @@ module ActiveEnum
90
86
  # user.sex = :male
91
87
  #
92
88
  def define_active_enum_write_method(attribute)
93
- define_write_method(attribute) unless instance_method_already_implemented?("#{attribute}")
94
- old_method = "#{attribute}_without_enum="
95
- define_method("#{attribute}_with_enum=") do |arg|
96
- enum = self.class.active_enum_for(attribute)
89
+ define_method("#{attribute}=") do |arg|
90
+ enum = self.class.enum_for(attribute)
97
91
  if arg.is_a?(Symbol)
98
92
  value = enum[arg]
99
- send(old_method, value)
93
+ super(value)
100
94
  else
101
- send(old_method, arg)
95
+ super(arg)
102
96
  end
103
97
  end
104
-
105
- alias_method_chain :"#{attribute}=", :enum
106
98
  end
107
99
 
108
100
  # Define question method to check enum value against attribute value
@@ -110,18 +102,14 @@ module ActiveEnum
110
102
  # user.sex?(:male)
111
103
  #
112
104
  def define_active_enum_question_method(attribute)
113
- define_question_method(attribute) unless instance_method_already_implemented?("#{attribute}?")
114
-
115
- old_method = "#{attribute}_without_enum?"
116
- define_method("#{attribute}_with_enum?") do |*arg|
105
+ define_method("#{attribute}?") do |*arg|
117
106
  arg = arg.first
118
107
  if arg
119
- send(attribute) == self.class.active_enum_for(attribute)[arg]
108
+ send(attribute) == self.class.enum_for(attribute)[arg]
120
109
  else
121
- send(old_method)
110
+ super
122
111
  end
123
112
  end
124
- alias_method_chain :"#{attribute}?", :enum
125
113
  end
126
114
 
127
115
  end
@@ -0,0 +1,14 @@
1
+ module ActiveEnum
2
+ module FormHelpers
3
+ module Formtastic
4
+
5
+ def enum_input(method, options)
6
+ raise "Attribute '#{method}' has no enum class" unless enum = @object.class.enum_for(method)
7
+ select_input(method, options.merge(:collection => enum.to_select))
8
+ end
9
+
10
+ end
11
+ end
12
+ end
13
+
14
+ Formtastic::SemanticFormBuilder.send :include, ActiveEnum::FormHelpers::Formtastic
@@ -0,0 +1,18 @@
1
+ module ActiveEnum
2
+ module FormHelpers
3
+ class SimpleForm < SimpleForm::Inputs::CollectionInput
4
+
5
+ def initialize(builder)
6
+ super
7
+ raise "Attribute '#{attribute_name}' has no enum class" unless enum = object.class.enum_for(attribute_name)
8
+ builder.options[:collection] = enum.to_select
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+
15
+ SimpleForm::FormBuilder.class_eval do
16
+ map_type :enum, :to => ActiveEnum::FormHelpers::SimpleForm
17
+ alias_method :collection_enum, :collection_select
18
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveEnum
2
- VERSION = '0.6.6'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -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 :active_enum_for method to ActiveRecord' do
21
- ActiveRecord::Base.should respond_to(:active_enum_for)
20
+ it 'should add class :enum_for method to ActiveRecord' do
21
+ ActiveRecord::Base.should respond_to(: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.active_enum_for(:attending).should == Accepted
29
- Person.active_enum_for(:staying).should == Accepted
28
+ Person.enum_for(:attending).should == Accepted
29
+ Person.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.active_enum_for(:sex).should == Sex
36
+ Person.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.active_enum_for(:sex).should == ::Person::Sex
45
+ Person.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
@@ -0,0 +1,37 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'formtastic'
4
+ require 'active_enum/form_helpers/formtastic'
5
+
6
+ describe ActiveEnum::FormHelpers::Formtastic do
7
+ include RSpec::Rails::HelperExampleGroup
8
+ include Formtastic::SemanticFormHelper
9
+
10
+ before do
11
+ reset_class Person do
12
+ enumerate :sex do
13
+ value :id => 1, :name => 'Male'
14
+ value :id => 2, :name => 'Female'
15
+ end
16
+ end
17
+ end
18
+
19
+ it "should use enum class for select option values for enum input type" do
20
+ output = semantic_form_for(Person.new, :url => people_path) do |f|
21
+ concat f.input(:sex, :as => :enum)
22
+ end
23
+ output.should have_selector('select#person_sex')
24
+ output.should have_xpath('//option[@value=1]', :content => 'Male')
25
+ output.should have_xpath('//option[@value=2]', :content => 'Female')
26
+ end
27
+
28
+ it "should raise error if attribute for enum input is not enumerated" do
29
+ lambda {
30
+ semantic_form_for(Person.new, :url => people_path) {|f| f.input(:attending, :as => :enum) }
31
+ }.should raise_error "Attribute 'attending' has no enum class"
32
+ end
33
+
34
+ def people_path
35
+ '/people'
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'simple_form'
4
+ require 'active_enum/form_helpers/simple_form'
5
+
6
+ describe ActiveEnum::FormHelpers do
7
+ include RSpec::Rails::HelperExampleGroup
8
+ include SimpleForm::ActionViewExtensions::FormHelper
9
+
10
+ before do
11
+ controller.stub!(:action_name).and_return('new')
12
+ reset_class Person do
13
+ enumerate :sex do
14
+ value :id => 1, :name => 'Male'
15
+ value :id => 2, :name => 'Female'
16
+ end
17
+ end
18
+ end
19
+
20
+ it "should use enum class for select option values for enum input type" do
21
+ output = simple_form_for(Person.new, :url => people_path) do |f|
22
+ concat f.input(:sex, :as => :enum)
23
+ end
24
+ output.should have_selector('select#person_sex')
25
+ output.should have_xpath('//option[@value=1]', :content => 'Male')
26
+ output.should have_xpath('//option[@value=2]', :content => 'Female')
27
+ end
28
+
29
+ it "should raise error if attribute for enum input is not enumerated" do
30
+ lambda {
31
+ simple_form_for(Person.new, :url => people_path) {|f| f.input(:attending, :as => :enum) }
32
+ }.should raise_error(StandardError, "Attribute 'attending' has no enum class")
33
+ end
34
+
35
+ def people_path
36
+ '/people'
37
+ end
38
+ end
@@ -2,7 +2,8 @@ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'spec'))
3
3
 
4
4
  require 'rubygems'
5
- require 'spec/autorun'
5
+ require 'rspec/autorun'
6
+ require 'rspec/rails'
6
7
 
7
8
  require 'active_record'
8
9
  require 'active_enum'
@@ -27,6 +28,6 @@ module SpecHelper
27
28
  end
28
29
  end
29
30
 
30
- Spec::Runner.configure do |config|
31
+ RSpec.configure do |config|
31
32
  config.include SpecHelper
32
33
  end
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: 11
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 6
9
- - 6
10
- version: 0.6.6
8
+ - 7
9
+ - 0
10
+ version: 0.7.0
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-08-06 00:00:00 +10:00
18
+ date: 2010-06-24 00:00:00 +10:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -34,13 +34,15 @@ files:
34
34
  - lib/active_enum/acts_as_enum.rb
35
35
  - lib/active_enum/base.rb
36
36
  - lib/active_enum/extensions.rb
37
- - lib/active_enum/formtastic.rb
37
+ - lib/active_enum/form_helpers/formtastic.rb
38
+ - lib/active_enum/form_helpers/simple_form.rb
38
39
  - lib/active_enum/version.rb
39
40
  - lib/active_enum.rb
40
41
  - spec/active_enum/acts_as_enum_spec.rb
41
42
  - spec/active_enum/base_spec.rb
42
43
  - spec/active_enum/extensions_spec.rb
43
- - spec/active_enum/formtastic_spec.rb
44
+ - spec/active_enum/form_helpers/formtastic_spec.rb
45
+ - spec/active_enum/form_helpers/simple_form_spec.rb
44
46
  - spec/active_enum_spec.rb
45
47
  - spec/schema.rb
46
48
  - spec/spec_helper.rb
@@ -1,12 +0,0 @@
1
- module ActiveEnum
2
- module Formtastic
3
-
4
- def enum_input(method, options)
5
- raise "Attribute '#{method}' has no enum class" unless enum = @object.class.active_enum_for(method)
6
- select_input(method, options.merge(:collection => enum.to_select))
7
- end
8
-
9
- end
10
- end
11
-
12
- Formtastic::SemanticFormBuilder.send :include, ActiveEnum::Formtastic
@@ -1,59 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- require 'action_controller'
4
- require 'action_view'
5
- require 'formtastic'
6
- require 'rspec_tag_matchers'
7
- require 'active_enum/formtastic'
8
-
9
- describe ActiveEnum::Formtastic do
10
- include ActionView::Helpers::FormHelper
11
- include ActionView::Helpers::FormTagHelper
12
- include ActionView::Helpers::FormOptionsHelper
13
- include ActionView::Helpers::UrlHelper
14
- include ActionView::Helpers::TagHelper
15
- include ActionView::Helpers::TextHelper
16
- include ActionView::Helpers::ActiveRecordHelper
17
- include ActionView::Helpers::RecordIdentificationHelper
18
- include ActionView::Helpers::CaptureHelper
19
- include ActionController::PolymorphicRoutes
20
- include Formtastic::SemanticFormHelper
21
- include RspecTagMatchers
22
-
23
- attr_accessor :output_buffer
24
-
25
- before do
26
- reset_class Person do
27
- enumerate :sex do
28
- value :id => 1, :name => 'Male'
29
- value :id => 2, :name => 'Female'
30
- end
31
- end
32
-
33
- @output_buffer = ''
34
- end
35
-
36
- it "should use enum class for select option values for enum input type" do
37
- semantic_form_for(Person.new) do |f|
38
- concat f.input(:sex, :as => :enum)
39
- end
40
- output_buffer.should have_tag('select#person_sex') do |inner|
41
- inner.should have_tag('//option[@value=1]', 'Male')
42
- inner.should have_tag('//option[@value=2]', 'Female')
43
- end
44
- end
45
-
46
- it "should raise error if attribute for enum input is not enumerated" do
47
- lambda do
48
- semantic_form_for(Person.new) {|f| f.input(:attending, :as => :enum) }
49
- end.should raise_error "Attribute 'attending' has no enum class"
50
- end
51
-
52
- def protect_against_forgery?
53
- false
54
- end
55
-
56
- def people_path
57
- '/people'
58
- end
59
- end