active_enum 0.9.0 → 0.9.1

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 CHANGED
@@ -1,3 +1,6 @@
1
+ [0.9.1] : 2011-01-12
2
+ - Fix SimpleForm helper for v1.3.0 with backwards compat.
3
+
1
4
  [0.9.0] : 2010-08-11
2
5
  - Full ActiveModel support for enumerate extension. Use ActiveEnum.extend_classes array to indicate classes to extend.
3
6
  - Added generator for initializer config file with all settings.
@@ -7,7 +7,7 @@ Enum values are stored in memory at the moment but I plan to add database and po
7
7
 
8
8
  == Install
9
9
 
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.
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}[https://github.com/adzap/active_enum/tree/0.6].
11
11
 
12
12
  gem install active_enum
13
13
 
data/Rakefile CHANGED
@@ -20,9 +20,7 @@ spec = Gem::Specification.new do |s|
20
20
  s.author = "Adam Meehan"
21
21
  s.email = "adam.meehan@gmail.com"
22
22
  s.homepage = "http://github.com/adzap/active_enum"
23
-
24
23
  s.require_path = 'lib'
25
- s.autorequire = GEM_NAME
26
24
  s.files = %w(active_enum.gemspec MIT-LICENSE CHANGELOG README.rdoc Rakefile) + Dir.glob("{lib,spec}/**/*")
27
25
  end
28
26
 
@@ -2,16 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{active_enum}
5
- s.version = "0.9.0"
5
+ s.version = "0.9.1"
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
- s.autorequire = %q{active_enum}
10
- s.date = %q{2010-08-11}
9
+ s.date = %q{2011-01-12}
11
10
  s.description = %q{Define enum classes in Rails and use them to enumerate ActiveRecord attributes}
12
11
  s.email = %q{adam.meehan@gmail.com}
13
12
  s.extra_rdoc_files = ["README.rdoc"]
14
- s.files = ["active_enum.gemspec", "MIT-LICENSE", "CHANGELOG", "README.rdoc", "Rakefile", "lib/active_enum", "lib/active_enum/acts_as_enum.rb", "lib/active_enum/base.rb", "lib/active_enum/extensions.rb", "lib/active_enum/form_helpers", "lib/active_enum/form_helpers/formtastic.rb", "lib/active_enum/form_helpers/simple_form.rb", "lib/active_enum/storage", "lib/active_enum/storage/abstract_store.rb", "lib/active_enum/storage/active_record_store.rb", "lib/active_enum/storage/memory_store.rb", "lib/active_enum/version.rb", "lib/active_enum.rb", "lib/generators", "lib/generators/active_enum", "lib/generators/active_enum/install_generator.rb", "lib/generators/active_enum/templates", "lib/generators/active_enum/templates/active_enum.rb", "spec/active_enum", "spec/active_enum/acts_as_enum_spec.rb", "spec/active_enum/base_spec.rb", "spec/active_enum/extensions_spec.rb", "spec/active_enum/form_helpers", "spec/active_enum/form_helpers/formtastic_spec.rb", "spec/active_enum/form_helpers/simple_form_spec.rb", "spec/active_enum/storage", "spec/active_enum/storage/active_record_store_spec.rb", "spec/active_enum/storage/memory_store_spec.rb", "spec/active_enum_spec.rb", "spec/schema.rb", "spec/spec_helper.rb"]
13
+ s.files = ["active_enum.gemspec", "MIT-LICENSE", "CHANGELOG", "README.rdoc", "Rakefile", "lib/active_enum", "lib/active_enum/acts_as_enum.rb", "lib/active_enum/base.rb", "lib/active_enum/extensions.rb", "lib/active_enum/form_helpers", "lib/active_enum/form_helpers/formtastic.rb", "lib/active_enum/form_helpers/simple_form.rb", "lib/active_enum/storage", "lib/active_enum/storage/abstract_store.rb", "lib/active_enum/storage/memory_store.rb", "lib/active_enum/version.rb", "lib/active_enum.rb", "lib/generators", "lib/generators/active_enum", "lib/generators/active_enum/install_generator.rb", "lib/generators/active_enum/templates", "lib/generators/active_enum/templates/active_enum.rb", "spec/active_enum", "spec/active_enum/acts_as_enum_spec.rb", "spec/active_enum/base_spec.rb", "spec/active_enum/extensions_spec.rb", "spec/active_enum/form_helpers", "spec/active_enum/form_helpers/formtastic_spec.rb", "spec/active_enum/form_helpers/simple_form_spec.rb", "spec/active_enum/storage", "spec/active_enum/storage/memory_store_spec.rb", "spec/active_enum_spec.rb", "spec/schema.rb", "spec/spec_helper.rb"]
15
14
  s.homepage = %q{http://github.com/adzap/active_enum}
16
15
  s.require_paths = ["lib"]
17
16
  s.rubyforge_project = %q{active_enum}
@@ -1,10 +1,11 @@
1
1
  require 'active_enum/base'
2
2
  require 'active_enum/extensions'
3
- require 'active_enum/acts_as_enum'
3
+ require 'active_enum/acts_as_enum' if defined?(ActiveRecord)
4
4
  require 'active_enum/storage/abstract_store'
5
- require 'active_enum/version'
6
5
 
7
6
  module ActiveEnum
7
+ autoload :VERSION, 'active_enum/version'
8
+
8
9
  mattr_accessor :enum_classes
9
10
  @@enum_classes = []
10
11
 
@@ -15,7 +16,7 @@ module ActiveEnum
15
16
  @@storage = :memory
16
17
 
17
18
  mattr_accessor :extend_classes
18
- @@extend_classes = []
19
+ @@extend_classes = [ defined?(ActiveRecord) && ActiveRecord::Base ].compact
19
20
 
20
21
  def self.extend_classes=(klasses)
21
22
  @@extend_classes = klasses
@@ -1,11 +1,6 @@
1
1
  module ActiveEnum
2
-
3
2
  module ActsAsEnum
4
3
 
5
- def self.included(base)
6
- base.extend MacroMethods
7
- end
8
-
9
4
  module MacroMethods
10
5
 
11
6
  def acts_as_enum(options={})
@@ -58,4 +53,4 @@ module ActiveEnum
58
53
  end
59
54
  end
60
55
 
61
- ActiveRecord::Base.send :include, ActiveEnum::ActsAsEnum
56
+ ActiveRecord::Base.extend ActiveEnum::ActsAsEnum::MacroMethods
@@ -11,15 +11,19 @@ module ActiveEnum
11
11
  ActiveEnum.enum_classes << subclass
12
12
  end
13
13
 
14
- # :id => 1, :name => 'Foo'
15
- # :name => 'Foo'
16
- # 1 => 'Foo'
14
+ # Define enum values.
15
+ #
16
+ # Examples:
17
+ # value :id => 1, :name => 'Foo'
18
+ # value :name => 'Foo' # implicit id, incrementing from 1.
19
+ # value 1 => 'Foo'
17
20
  #
18
21
  def value(enum_value)
19
22
  store.set *id_and_name_and_meta(enum_value)
20
23
  end
21
24
 
22
- # Order enum values. Allowed values are :asc, :desc or :as_defined
25
+ # Specify order enum values are returned.
26
+ # Allowed values are :asc, :desc or :as_defined
23
27
  #
24
28
  def order(order)
25
29
  @order = order
@@ -29,18 +33,23 @@ module ActiveEnum
29
33
  store.values
30
34
  end
31
35
 
36
+ # Array of all enum id values
32
37
  def ids
33
38
  store.values.map {|v| v[0] }
34
39
  end
35
40
 
41
+ # Array of all enum name values
36
42
  def names
37
43
  store.values.map {|v| v[1] }
38
44
  end
39
45
 
46
+ # Return enum values in an array suitable to pass to a Rails form select helper.
40
47
  def to_select
41
48
  store.values.map {|v| [v[1], v[0]] }
42
49
  end
43
50
 
51
+ # Access id or name value. Pass an id number to retrieve the name or
52
+ # a symbol or string to retrieve the matching id.
44
53
  def [](index)
45
54
  if index.is_a?(Fixnum)
46
55
  row = store.get_by_id(index)
@@ -51,6 +60,7 @@ module ActiveEnum
51
60
  end
52
61
  end
53
62
 
63
+ # Access any meta data defined for a given id or name. Returns a hash.
54
64
  def meta(index)
55
65
  row = if index.is_a?(Fixnum)
56
66
  store.get_by_id(index)
@@ -13,6 +13,7 @@ module ActiveEnum
13
13
 
14
14
  # Declare an attribute to be enumerated by an enum class
15
15
  #
16
+ # Example:
16
17
  # class Person < ActiveRecord::Base
17
18
  # enumerate :sex, :with => Sex
18
19
  # enumerate :sex # implies a Sex enum class exists
@@ -26,6 +27,7 @@ module ActiveEnum
26
27
  # enumerate :to, :from, :with => Sex
27
28
  #
28
29
  def enumerate(*attributes, &block)
30
+ self.enumerated_attributes ||= {}
29
31
  options = attributes.extract_options!
30
32
  attributes.each do |attribute|
31
33
  begin
@@ -51,11 +53,12 @@ module ActiveEnum
51
53
  end
52
54
 
53
55
  def active_enum_for(attribute)
54
- self.enumerated_attributes[attribute.to_sym]
56
+ self.enumerated_attributes && self.enumerated_attributes[attribute.to_sym]
55
57
  end
56
58
 
57
59
  # Define read method to allow an argument for the enum component
58
60
  #
61
+ # Examples:
59
62
  # user.sex
60
63
  # user.sex(:id)
61
64
  # user.sex(:name)
@@ -87,6 +90,7 @@ module ActiveEnum
87
90
 
88
91
  # Define write method to also handle enum value
89
92
  #
93
+ # Examples:
90
94
  # user.sex = 1
91
95
  # user.sex = :male
92
96
  #
@@ -105,6 +109,7 @@ module ActiveEnum
105
109
 
106
110
  # Define question method to check enum value against attribute value
107
111
  #
112
+ # Example:
108
113
  # user.sex?(:male)
109
114
  #
110
115
  def define_active_enum_question_method(attribute)
@@ -1,10 +1,6 @@
1
1
  module ActiveEnum
2
2
  module FormHelpers
3
3
  module Formtastic
4
- def self.included(base)
5
- base.alias_method_chain :default_input_type, :active_enum
6
- end
7
-
8
4
  def default_input_type_with_active_enum(method, options)
9
5
  return :enum if @object.class.respond_to?(:active_enum_for) && @object.class.active_enum_for(method)
10
6
  default_input_type_without_active_enum(method, options)
@@ -19,4 +15,7 @@ module ActiveEnum
19
15
  end
20
16
  end
21
17
 
22
- Formtastic::SemanticFormBuilder.send :include, ActiveEnum::FormHelpers::Formtastic
18
+ Formtastic::SemanticFormBuilder.class_eval do
19
+ include ActiveEnum::FormHelpers::Formtastic
20
+ alias_method_chain :default_input_type, :active_enum
21
+ end
@@ -2,24 +2,26 @@ module ActiveEnum
2
2
  module FormHelpers
3
3
  module SimpleForm
4
4
  module BuilderExtension
5
- def self.included(base)
6
- base.alias_method_chain :default_input_type, :active_enum
7
- end
8
5
 
9
- def default_input_type_with_active_enum
10
- return :enum if @options[:as].nil? &&
11
- object.class.respond_to?(:active_enum_for) &&
12
- object.class.active_enum_for(attribute_name)
13
- default_input_type_without_active_enum
6
+ def default_input_type_with_active_enum(*args, &block)
7
+ return :enum if (args.last.is_a?(Hash) ? args.last[:as] : @options[:as]).nil? &&
8
+ object.class.respond_to?(:active_enum_for) &&
9
+ object.class.active_enum_for(args.first || @attribute_name)
10
+ default_input_type_without_active_enum(*args, &block)
14
11
  end
12
+
15
13
  end
16
14
 
17
15
  class EnumInput < ::SimpleForm::Inputs::CollectionInput
18
16
 
19
- def initialize(builder)
17
+ def initialize(*args)
20
18
  super
21
19
  raise "Attribute '#{attribute_name}' has no enum class" unless enum = object.class.active_enum_for(attribute_name)
22
- builder.options[:collection] = enum.to_select
20
+ if respond_to?(:input_options)
21
+ input_options[:collection] = enum.to_select
22
+ else
23
+ @builder.options[:collection] = enum.to_select
24
+ end
23
25
  end
24
26
 
25
27
  end
@@ -32,4 +34,5 @@ SimpleForm::FormBuilder.class_eval do
32
34
 
33
35
  map_type :enum, :to => ActiveEnum::FormHelpers::SimpleForm::EnumInput
34
36
  alias_method :collection_enum, :collection_select
37
+ alias_method_chain :default_input_type, :active_enum
35
38
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveEnum
2
- VERSION = '0.9.0'
2
+ VERSION = '0.9.1'
3
3
  end
@@ -4,8 +4,8 @@
4
4
 
5
5
  ActiveEnum.setup do |config|
6
6
 
7
- # Extend classes to add enumerate method
8
- config.extend_classes = [ ActiveRecord::Base ]
7
+ # Extend classes to add enumerate method
8
+ # config.extend_classes = [ ActiveRecord::Base ]
9
9
 
10
10
  # Return name string as value for attribute method
11
11
  # config.use_name_as_value = false
@@ -1,18 +1,18 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- class Person < ActiveRecord::Base
4
- acts_as_enum :name_column => 'first_name'
5
- end
3
+ describe ActiveEnum::ActsAsEnum do
4
+ class Person < ActiveRecord::Base
5
+ acts_as_enum :name_column => 'first_name'
6
+ end
6
7
 
7
- class TestPerson < ActiveRecord::Base
8
- def self.extended_modules
9
- class << self
10
- self.included_modules
8
+ class TestPerson < ActiveRecord::Base
9
+ def self.extended_modules
10
+ class << self
11
+ self.included_modules
12
+ end
11
13
  end
12
14
  end
13
- end
14
15
 
15
- describe ActiveEnum::ActsAsEnum do
16
16
  before(:all) do
17
17
  Person.create!(:first_name => 'Dave', :last_name => 'Smith')
18
18
  Person.create!(:first_name => 'John', :last_name => 'Doe')
@@ -42,9 +42,7 @@ describe ActiveEnum::ActsAsEnum do
42
42
  end
43
43
 
44
44
  it "should return sorted array from order value for select helpers from to_select" do
45
- Person.class_eval do
46
- acts_as_enum :name_column => 'first_name', :order => :desc
47
- end
45
+ Person.acts_as_enum :name_column => 'first_name', :order => :desc
48
46
  Person.to_select.should == [['John', 2], ['Dave', 1]]
49
47
  end
50
48
  end
@@ -2,13 +2,13 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe ActiveEnum::Base do
4
4
 
5
- context ".store" do
5
+ describe ".store" do
6
6
  it 'should load the storage class instance using the storage setting' do
7
7
  ActiveEnum::Base.send(:store).should be_instance_of(ActiveEnum::Storage::MemoryStore)
8
8
  end
9
9
  end
10
10
 
11
- context ".enum_classes" do
11
+ describe ".enum_classes" do
12
12
  it 'should return all enum classes defined use class definition' do
13
13
  ActiveEnum.enum_classes = []
14
14
  class NewEnum < ActiveEnum::Base; end
@@ -24,13 +24,21 @@ describe ActiveEnum::Base do
24
24
  end
25
25
  end
26
26
 
27
- context ".all" do
27
+ describe ".all" do
28
28
  it 'should return an empty array when no values defined' do
29
29
  define_enum.all.should == []
30
30
  end
31
+
32
+ it 'should return an array of arrays with all values defined as [id, name]' do
33
+ enum = define_enum do
34
+ value :name => 'Name 1'
35
+ value :name => 'Name 2'
36
+ end
37
+ enum.all.should == [[1,'Name 1'], [2, 'Name 2']]
38
+ end
31
39
  end
32
40
 
33
- context ".value" do
41
+ describe ".value" do
34
42
  it 'should allow me to define a value with an id and name' do
35
43
  enum = define_enum do
36
44
  value :id => 1, :name => 'Name'
@@ -86,7 +94,7 @@ describe ActiveEnum::Base do
86
94
  end
87
95
  end
88
96
 
89
- context ".meta" do
97
+ describe ".meta" do
90
98
  it 'should return meta values hash for a given index value' do
91
99
  enum = define_enum do
92
100
  value :id => 1, :name => 'Name', :description => 'extra'
@@ -132,7 +140,7 @@ describe ActiveEnum::Base do
132
140
  end
133
141
  end
134
142
 
135
- context ".ids" do
143
+ describe ".ids" do
136
144
  it 'should return array of ids' do
137
145
  enum = define_enum do
138
146
  value :id => 1, :name => 'Name 1'
@@ -142,7 +150,7 @@ describe ActiveEnum::Base do
142
150
  end
143
151
  end
144
152
 
145
- context ".names" do
153
+ describe ".names" do
146
154
  it 'should return array of names' do
147
155
  enum = define_enum do
148
156
  value :id => 1, :name => 'Name 1'
@@ -181,7 +189,7 @@ describe ActiveEnum::Base do
181
189
 
182
190
  end
183
191
 
184
- context ".to_select" do
192
+ describe ".to_select" do
185
193
  it 'should return array for select helpers' do
186
194
  enum = define_enum do
187
195
  value :id => 1, :name => 'Name 1'
@@ -1,17 +1,16 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- class Sex < ActiveEnum::Base
4
- value :id => 1, :name => 'Male'
5
- value :id => 2, :name => 'Female'
6
- end
7
-
8
- class Accepted < ActiveEnum::Base
9
- value :id => 0, :name => 'No'
10
- value :id => 1, :name => 'Definitely'
11
- value :id => 2, :name => 'Maybe'
12
- end
13
-
14
3
  describe ActiveEnum::Extensions do
4
+ class Sex < ActiveEnum::Base
5
+ value :id => 1, :name => 'Male'
6
+ value :id => 2, :name => 'Female'
7
+ end
8
+
9
+ class Accepted < ActiveEnum::Base
10
+ value :id => 0, :name => 'No'
11
+ value :id => 1, :name => 'Definitely'
12
+ value :id => 2, :name => 'Maybe'
13
+ end
15
14
 
16
15
  it 'should add class :enumerate method to ActiveRecord' do
17
16
  ActiveRecord::Base.should respond_to(:enumerate)
@@ -22,109 +21,99 @@ describe ActiveEnum::Extensions do
22
21
  end
23
22
 
24
23
  it 'should allow multiple attributes to be enumerated with same enum' do
25
- Person.class_eval do
26
- enumerate :attending, :staying, :with => Accepted
27
- end
24
+ Person.enumerate :attending, :staying, :with => Accepted
28
25
  Person.active_enum_for(:attending).should == Accepted
29
26
  Person.active_enum_for(:staying).should == Accepted
30
27
  end
31
28
 
32
29
  it 'should allow implicit enumeration class from attribute name' do
33
- Person.class_eval do
34
- enumerate :sex
35
- end
30
+ Person.enumerate :sex
36
31
  Person.active_enum_for(:sex).should == Sex
37
32
  end
38
33
 
39
34
  it 'should create enum namespaced enum class from block' do
40
- Person.class_eval do
41
- enumerate :sex do
42
- value :id => 1, :name => 'Male'
43
- end
35
+ Person.enumerate :sex do
36
+ value :id => 1, :name => 'Male'
44
37
  end
45
38
  Person.active_enum_for(:sex).should == ::Person::Sex
46
39
  end
47
40
 
48
41
  it 'should raise error if implicit enumeration class cannot be found' do
49
- lambda do
50
- Person.class_eval { enumerate :first_name }
51
- end.should raise_error(ActiveEnum::EnumNotFound)
42
+ expect {
43
+ Person.enumerate :first_name
44
+ }.should raise_error(ActiveEnum::EnumNotFound)
52
45
  end
53
46
 
54
- describe "attribute" do
47
+ context "attribute" do
48
+ let(:person) { Person.new(:sex => 1) }
49
+
55
50
  before(:all) do
56
51
  reset_class Person do
57
52
  enumerate :sex, :with => Sex
58
53
  end
59
54
  end
60
55
 
61
- before do
62
- @person = Person.new(:sex =>1)
63
- end
64
-
65
- describe "with value" do
56
+ context "with value" do
66
57
  it 'should return value with no arg' do
67
- @person.sex.should == 1
58
+ person.sex.should == 1
68
59
  end
69
60
 
70
61
  it 'should return enum id for value' do
71
- @person.sex(:id).should == 1
62
+ person.sex(:id).should == 1
72
63
  end
73
64
 
74
65
  it 'should return enum name for value' do
75
- @person.sex(:name).should == 'Male'
66
+ person.sex(:name).should == 'Male'
76
67
  end
77
68
 
78
69
  it 'should return enum class for attribute' do
79
- @person.sex(:enum).should == Sex
70
+ person.sex(:enum).should == Sex
80
71
  end
81
72
  end
82
73
 
83
- describe "with nil value" do
84
- before do
85
- @person.sex = nil
86
- end
74
+ context "with nil value" do
75
+ let(:person) { Person.new(:sex => nil) }
87
76
 
88
77
  it 'should return nil with no arg' do
89
- @person.sex.should be_nil
78
+ person.sex.should be_nil
90
79
  end
91
80
 
92
81
  it 'should return nil enum id' do
93
- @person.sex(:id).should be_nil
82
+ person.sex(:id).should be_nil
94
83
  end
95
84
 
96
85
  it 'should return nil enum name' do
97
- @person.sex(:name).should be_nil
86
+ person.sex(:name).should be_nil
98
87
  end
99
88
 
100
89
  it 'should return enum class for attribute' do
101
- @person.sex(:enum).should == Sex
90
+ person.sex(:enum).should == Sex
102
91
  end
103
92
  end
104
93
 
105
- describe "with undefined value" do
106
- before do
107
- @person.sex = -1
108
- end
94
+ context "with undefined value" do
95
+ let(:person) { Person.new(:sex => -1) }
109
96
 
110
97
  it 'should return value with no arg' do
111
- @person.sex.should == -1
98
+ person.sex.should == -1
112
99
  end
113
100
 
114
101
  it 'should return nil enum id' do
115
- @person.sex(:id).should be_nil
102
+ person.sex(:id).should be_nil
116
103
  end
117
104
 
118
105
  it 'should return nil enum name' do
119
- @person.sex(:name).should be_nil
106
+ person.sex(:name).should be_nil
120
107
  end
121
108
 
122
109
  it 'should return enum class for attribute' do
123
- @person.sex(:enum).should == Sex
110
+ person.sex(:enum).should == Sex
124
111
  end
125
112
  end
126
113
 
127
- describe "with meta data" do
114
+ context "with meta data" do
115
+ let(:person) { Person.new(:sex =>1) }
116
+
128
117
  before(:all) do
129
118
  reset_class Person do
130
119
  enumerate :sex do
@@ -134,84 +123,72 @@ describe ActiveEnum::Extensions do
134
123
  end
135
124
  end
136
125
 
137
- before do
138
- @person = Person.new(:sex =>1)
139
- end
140
-
141
126
  it 'should return meta value for existing key' do
142
- @person.sex(:description).should == 'Man'
127
+ person.sex(:description).should == 'Man'
143
128
  end
144
129
 
145
130
  it 'should return nil for missing meta value' do
146
- @person.sex(:nonexistent).should be_nil
131
+ person.sex(:nonexistent).should be_nil
147
132
  end
148
133
 
149
134
  it 'should return nil for missing index' do
150
- @person.sex = nil
151
- @person.sex(:description).should be_nil
135
+ person.sex = nil
136
+ person.sex(:description).should be_nil
152
137
  end
153
138
  end
154
139
 
155
- describe "question method" do
156
- before do
157
- @person.sex = 1
158
- end
159
-
140
+ context "question method" do
160
141
  it 'should return normal value without arg' do
161
- @person.sex?.should be_true
162
- @person.sex = nil
163
- @person.sex?.should be_false
142
+ person.sex?.should be_true
143
+ person.sex = nil
144
+ person.sex?.should be_false
164
145
  end
165
146
 
166
147
  it 'should return true if string name matches for id value' do
167
- @person.sex?("Male").should be_true
148
+ person.sex?("Male").should be_true
168
149
  end
169
150
 
170
151
  it 'should return true if symbol name matches for id value' do
171
- @person.sex?(:male).should be_true
172
- @person.sex?(:Male).should be_true
152
+ person.sex?(:male).should be_true
153
+ person.sex?(:Male).should be_true
173
154
  end
174
155
 
175
156
  it 'should return false if name does not match for id value' do
176
- @person.sex?("Female").should be_false
177
- @person.sex?(:female).should be_false
178
- @person.sex?(:Female).should be_false
157
+ person.sex?("Female").should be_false
158
+ person.sex?(:female).should be_false
159
+ person.sex?(:Female).should be_false
179
160
  end
180
161
  end
181
162
 
182
- describe "with value as enum name symbol" do
163
+ context "with value as enum name symbol" do
183
164
 
184
165
  it 'should store id value when valid enum name' do
185
- @person.sex = :female
186
- @person.sex.should == 2
166
+ person.sex = :female
167
+ person.sex.should == 2
187
168
  end
188
169
 
189
170
  it 'should store nil value when invalid enum name' do
190
- @person.sex = :invalid
191
- @person.sex.should == nil
171
+ person.sex = :invalid
172
+ person.sex.should == nil
192
173
  end
193
174
 
194
175
  end
195
176
 
196
- describe "with value as enum name" do
197
- before(:all) do
198
- ActiveEnum.use_name_as_value = true
199
- end
177
+ context "with value as enum name" do
178
+ before(:all) { ActiveEnum.use_name_as_value = true }
179
+ let(:person) { Person.new(:sex =>1) }
200
180
 
201
- before do
181
+ before do
202
182
  reset_class Person do
203
183
  enumerate :sex, :with => Sex
204
184
  end
205
- @person = Person.new(:sex =>1)
206
- end
185
+ end
207
186
 
208
187
  it 'should return text name value for attribute' do
209
- @person.sex.should == 'Male'
188
+ person.sex.should == 'Male'
210
189
  end
211
190
 
212
- after(:all) do
213
- ActiveEnum.use_name_as_value = false
214
- end
191
+ after(:all) { ActiveEnum.use_name_as_value = false }
215
192
  end
216
193
 
217
194
  end
@@ -3,8 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
3
  require 'formtastic'
4
4
  require 'active_enum/form_helpers/formtastic'
5
5
 
6
- describe 'ActiveEnum::FormHelpers::Formtastic' do
7
- include RSpec::Rails::HelperExampleGroup
6
+ describe ActiveEnum::FormHelpers::Formtastic, :type => :helper do
8
7
  include Formtastic::SemanticFormHelper
9
8
 
10
9
  before do
@@ -25,6 +24,15 @@ describe 'ActiveEnum::FormHelpers::Formtastic' do
25
24
  output.should have_xpath('//option[@value=2]', :content => 'Female')
26
25
  end
27
26
 
27
+ it "should use explicit :enum input type" do
28
+ output = semantic_form_for(Person.new, :url => people_path) do |f|
29
+ concat f.input(:sex, :as => :enum)
30
+ end
31
+ output.should have_selector('select#person_sex')
32
+ output.should have_xpath('//option[@value=1]', :content => 'Male')
33
+ output.should have_xpath('//option[@value=2]', :content => 'Female')
34
+ end
35
+
28
36
  it "should not use enum input type if :as option indicates other type" do
29
37
  output = semantic_form_for(Person.new, :url => people_path) do |f|
30
38
  concat f.input(:sex, :as => :string)
@@ -33,18 +41,27 @@ describe 'ActiveEnum::FormHelpers::Formtastic' do
33
41
  end
34
42
 
35
43
  it "should raise error if attribute for enum input is not enumerated" do
36
- lambda {
37
- semantic_form_for(Person.new, :url => people_path) {|f| f.input(:attending, :as => :enum) }
44
+ expect {
45
+ semantic_form_for(Person.new, :url => people_path) do |f|
46
+ f.input(:attending, :as => :enum)
47
+ end
38
48
  }.should raise_error "Attribute 'attending' has no enum class"
39
49
  end
40
50
 
41
51
  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|
52
+ output = semantic_form_for(NotActiveRecord.new, :as => :not_active_record, :url => people_path) do |f|
43
53
  concat f.input(:name)
44
54
  end
45
55
  output.should have_selector('input#not_active_record_name')
46
56
  end
47
57
 
58
+ it "should allow non-enum fields to use default input determination" do
59
+ output = semantic_form_for(Person.new, :url => people_path) do |f|
60
+ concat f.input(:first_name)
61
+ end
62
+ output.should have_selector('input#person_first_name')
63
+ end
64
+
48
65
  def people_path
49
66
  '/people'
50
67
  end
@@ -3,8 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
3
  require 'simple_form'
4
4
  require 'active_enum/form_helpers/simple_form'
5
5
 
6
- describe 'ActiveEnum::FormHelpers::Simple' do
7
- include RSpec::Rails::HelperExampleGroup
6
+ describe ActiveEnum::FormHelpers::SimpleForm, :type => :helper do
8
7
  include SimpleForm::ActionViewExtensions::FormHelper
9
8
 
10
9
  before do
@@ -26,6 +25,15 @@ describe 'ActiveEnum::FormHelpers::Simple' do
26
25
  output.should have_xpath('//option[@value=2]', :content => 'Female')
27
26
  end
28
27
 
28
+ it "should use explicit :enum input type" do
29
+ output = simple_form_for(Person.new, :url => people_path) do |f|
30
+ concat f.input(:sex, :as => :enum)
31
+ end
32
+ output.should have_selector('select#person_sex')
33
+ output.should have_xpath('//option[@value=1]', :content => 'Male')
34
+ output.should have_xpath('//option[@value=2]', :content => 'Female')
35
+ end
36
+
29
37
  it "should not use enum input type if :as option indicates other type" do
30
38
  output = simple_form_for(Person.new, :url => people_path) do |f|
31
39
  concat f.input(:sex, :as => :string)
@@ -34,18 +42,27 @@ describe 'ActiveEnum::FormHelpers::Simple' do
34
42
  end
35
43
 
36
44
  it "should raise error if attribute for enum input is not enumerated" do
37
- lambda {
38
- simple_form_for(Person.new, :url => people_path) {|f| f.input(:attending, :as => :enum) }
39
- }.should raise_error(StandardError, "Attribute 'attending' has no enum class")
45
+ expect {
46
+ simple_form_for(Person.new, :url => people_path) do |f|
47
+ f.input(:attending, :as => :enum)
48
+ end
49
+ }.should raise_error "Attribute 'attending' has no enum class"
40
50
  end
41
51
 
42
52
  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|
53
+ output = simple_form_for(NotActiveRecord.new, :as => :not_active_record, :url => people_path) do |f|
44
54
  concat f.input(:name)
45
55
  end
46
56
  output.should have_selector('input#not_active_record_name')
47
57
  end
48
58
 
59
+ it "should allow non-enum fields to use default input determination" do
60
+ output = simple_form_for(Person.new, :url => people_path) do |f|
61
+ concat f.input(:first_name)
62
+ end
63
+ output.should have_selector('input#person_first_name')
64
+ end
65
+
49
66
  def people_path
50
67
  '/people'
51
68
  end
@@ -6,7 +6,7 @@ class TestOtherAREnum < ActiveEnum::Base; end
6
6
  describe ActiveEnum::Storage::MemoryStore do
7
7
  attr_accessor :store
8
8
 
9
- context '#set' do
9
+ describe '#set' do
10
10
  it 'should store value of id and name' do
11
11
  store.set 1, 'test name'
12
12
  store.values.should == [[1, 'test name']]
@@ -18,28 +18,28 @@ describe ActiveEnum::Storage::MemoryStore do
18
18
  end
19
19
 
20
20
  it 'should raise error if duplicate id' do
21
- lambda {
21
+ expect {
22
22
  store.set 1, 'Name 1'
23
23
  store.set 1, 'Other Name'
24
24
  }.should raise_error(ActiveEnum::DuplicateValue)
25
25
  end
26
26
 
27
27
  it 'should raise error if duplicate name' do
28
- lambda {
28
+ expect {
29
29
  store.set 1, 'Name 1'
30
30
  store.set 2, 'Name 1'
31
31
  }.should raise_error(ActiveEnum::DuplicateValue)
32
32
  end
33
33
 
34
34
  it 'should raise error if duplicate name matches title-case name' do
35
- lambda {
35
+ expect {
36
36
  store.set 1, 'Name 1'
37
37
  store.set 2, 'name 1'
38
38
  }.should raise_error(ActiveEnum::DuplicateValue)
39
39
  end
40
40
  end
41
41
 
42
- context "#values" do
42
+ describe "#values" do
43
43
  it 'should return array of stored values' do
44
44
  store.set 1, 'Name 1'
45
45
  store.values.should == [[1, 'Name 1']]
@@ -52,7 +52,7 @@ describe ActiveEnum::Storage::MemoryStore do
52
52
  end
53
53
  end
54
54
 
55
- context "#get_by_id" do
55
+ describe "#get_by_id" do
56
56
  it 'should return the value for a given id' do
57
57
  store.set 1, 'test name'
58
58
  store.get_by_id(1).should == [1, 'test name']
@@ -63,7 +63,7 @@ describe ActiveEnum::Storage::MemoryStore do
63
63
  end
64
64
  end
65
65
 
66
- context "#get_by_name" do
66
+ describe "#get_by_name" do
67
67
  it 'should return the value for a given name' do
68
68
  store.set 1, 'test name'
69
69
  store.get_by_name('test name').should == [1, 'test name']
@@ -79,7 +79,7 @@ describe ActiveEnum::Storage::MemoryStore do
79
79
  end
80
80
  end
81
81
 
82
- context "sort!" do
82
+ describe "#sort!" do
83
83
  it 'should sort values ascending when passed :asc' do
84
84
  @order = :asc
85
85
  store.set 2, 'Name 2'
@@ -1,8 +1,8 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
- describe "Bulk enum definitions" do
3
+ describe ActiveEnum do
4
4
 
5
- context ".define" do
5
+ describe ".define" do
6
6
  it 'should define enum constants using block' do
7
7
  ActiveEnum.define do
8
8
  enum(:foo) do
@@ -18,7 +18,7 @@ describe "Bulk enum definitions" do
18
18
  end
19
19
  end
20
20
 
21
- context ".setup" do
21
+ describe ".setup" do
22
22
  before :all do
23
23
  @original = ActiveEnum.use_name_as_value
24
24
  end
@@ -34,9 +34,8 @@ describe "Bulk enum definitions" do
34
34
  end
35
35
  end
36
36
 
37
- context ".extend_classes" do
37
+ describe ".extend_classes" do
38
38
  it 'should add enumerate extensions to given classes' do
39
- ActiveEnum.extend_classes = [ActiveRecord::Base, NotActiveRecord]
40
39
  ActiveRecord::Base.should respond_to(:enumerate)
41
40
  NotActiveRecord.should respond_to(:enumerate)
42
41
  end
@@ -1,5 +1,4 @@
1
1
  ActiveRecord::Schema.define(:version => 1) do
2
-
3
2
  create_table :people, :force => true do |t|
4
3
  t.string :first_name
5
4
  t.string :last_name
@@ -11,16 +10,4 @@ ActiveRecord::Schema.define(:version => 1) do
11
10
  create_table :sexes, :force => true do |t|
12
11
  t.string :name
13
12
  end
14
-
15
- create_table :enums, :force => true do |t|
16
- t.integer :enum_id
17
- t.string :name
18
- t.string :enum_type
19
- t.string :meta
20
- t.datetime :modified_at
21
- end
22
- add_index :enums, [:enum_id, :enum_type], :unique => true
23
- add_index :enums, [:name, :enum_type]
24
- add_index :enums, [:modified_at, :enum_type]
25
-
26
13
  end
@@ -1,9 +1,6 @@
1
- $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- $:.unshift(File.join(File.dirname(__FILE__), '..', 'spec'))
3
-
4
- require 'rubygems'
5
- require 'rspec/autorun'
1
+ require 'rspec'
6
2
 
3
+ require 'rails'
7
4
  require 'active_record'
8
5
  require 'action_controller'
9
6
  require 'action_view'
@@ -11,15 +8,19 @@ require 'action_mailer'
11
8
 
12
9
  require 'active_enum'
13
10
 
14
- RAILS_ROOT = File.dirname(__FILE__)
11
+ module Config
12
+ class Application < Rails::Application
13
+ config.generators do |g|
14
+ g.orm :active_record
15
+ g.test_framework :rspec, :fixture => false
16
+ end
17
+ end
18
+ end
15
19
 
16
20
  require 'rspec/rails'
17
21
 
18
22
  ActiveRecord::Migration.verbose = false
19
23
  ActiveRecord::Base.establish_connection({:adapter => 'sqlite3', :database => ':memory:'})
20
- ActiveRecord::Base.logger = Logger.new('/dev/null')
21
-
22
- ActiveEnum.extend_classes = [ActiveRecord::Base]
23
24
 
24
25
  require 'schema'
25
26
 
@@ -30,6 +31,8 @@ class NotActiveRecord
30
31
  attr_accessor :name
31
32
  end
32
33
 
34
+ ActiveEnum.extend_classes = [ActiveRecord::Base, NotActiveRecord]
35
+
33
36
  module SpecHelper
34
37
  def reset_class(klass, &block)
35
38
  name = klass.name.to_sym
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_enum
3
3
  version: !ruby/object:Gem::Version
4
- hash: 59
4
+ hash: 57
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 0
10
- version: 0.9.0
9
+ - 1
10
+ version: 0.9.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Adam Meehan
14
- autorequire: active_enum
14
+ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-11 00:00:00 +10:00
18
+ date: 2011-01-12 00:00:00 +11:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -39,7 +39,6 @@ files:
39
39
  - lib/active_enum/form_helpers/formtastic.rb
40
40
  - lib/active_enum/form_helpers/simple_form.rb
41
41
  - lib/active_enum/storage/abstract_store.rb
42
- - lib/active_enum/storage/active_record_store.rb
43
42
  - lib/active_enum/storage/memory_store.rb
44
43
  - lib/active_enum/version.rb
45
44
  - lib/active_enum.rb
@@ -50,7 +49,6 @@ files:
50
49
  - spec/active_enum/extensions_spec.rb
51
50
  - spec/active_enum/form_helpers/formtastic_spec.rb
52
51
  - spec/active_enum/form_helpers/simple_form_spec.rb
53
- - spec/active_enum/storage/active_record_store_spec.rb
54
52
  - spec/active_enum/storage/memory_store_spec.rb
55
53
  - spec/active_enum_spec.rb
56
54
  - spec/schema.rb
@@ -1,64 +0,0 @@
1
- module ActiveEnum
2
- class Model < ActiveRecord::Base
3
- set_table_name 'enums'
4
- serialize :meta, Hash
5
- end
6
-
7
- module Storage
8
- class ActiveRecordStore < AbstractStore
9
- def initialize(enum_class, order)
10
- super
11
- @values = values_from_db
12
- end
13
-
14
- def set(id, name)
15
- check_duplicate id, name
16
- values << [id, name]
17
- sort!
18
- end
19
-
20
- def get_by_id(id)
21
- values.assoc(id)
22
- end
23
-
24
- def get_by_name(name)
25
- values.rassoc(name.to_s) || values.rassoc(name.to_s.titleize)
26
- end
27
-
28
- def values
29
- @values
30
- end
31
-
32
- def check_duplicate(id, name)
33
- if get_by_id(id) || get_by_name(name)
34
- raise ActiveEnum::DuplicateValue
35
- end
36
- end
37
-
38
- def sort!
39
- return if @order == :as_defined
40
- case @order
41
- when :asc
42
- values.sort! {|a,b| a[0] <=> b[0] }
43
- when :desc
44
- values.sort! {|a,b| b[0] <=> a[0] }
45
- end
46
- end
47
-
48
- def order_clause
49
- @order_clause ||= case @order
50
- when :asc
51
- 'enum_id ASC'
52
- when :desc
53
- 'enum_id DESC'
54
- else
55
- 'modified_at ASC'
56
- end
57
- end
58
-
59
- def values_from_db
60
- ActiveEnum::Model.all(:conditions => {:enum_type => @enum.to_s}, :order => order_clause).map {|r| [r.enum_id, r.name] }
61
- end
62
- end
63
- end
64
- end
@@ -1,133 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
- require 'active_enum/storage/active_record_store'
3
-
4
- class TestARStoreEnum < ActiveEnum::Base; end
5
- class TestOtherAREnum < ActiveEnum::Base; end
6
-
7
- describe ActiveEnum::Storage::ActiveRecordStore do
8
- attr_accessor :store
9
-
10
- context '#set' do
11
- it 'should store value of id and name' do
12
- store.set 1, 'Name 1'
13
- store.values.should == [[1, 'Name 1']]
14
- end
15
-
16
- it 'should raise error if duplicate id' do
17
- lambda {
18
- store.set 1, 'Name 1'
19
- store.set 1, 'Other Name'
20
- }.should raise_error(ActiveEnum::DuplicateValue)
21
- end
22
-
23
- it 'should raise error if duplicate name' do
24
- lambda {
25
- store.set 1, 'Name 1'
26
- store.set 2, 'Name 1'
27
- }.should raise_error(ActiveEnum::DuplicateValue)
28
- end
29
-
30
- it 'should raise error if duplicate name matches title-case name' do
31
- lambda {
32
- store.set 1, 'Name 1'
33
- store.set 2, 'name 1'
34
- }.should raise_error(ActiveEnum::DuplicateValue)
35
- end
36
-
37
- it 'should create a record for values' do
38
- store.set 1, 'Name 1'
39
- ActiveEnum::Model.count.should == 1
40
- r = ActiveEnum::Model.first
41
- r.enum_id.should == 1
42
- r.name.should == 'Name 1'
43
- end
44
- end
45
-
46
- context "#values" do
47
- it 'should return array of stored values' do
48
- store.set 1, 'Name 1'
49
- store.values.should == [[1, 'Name 1']]
50
- end
51
-
52
- it 'should return values for set enum only' do
53
- alt_store.set 1, 'Other Name 1'
54
- store.set 1, 'Name 1'
55
- store.values.should == [[1, 'Name 1']]
56
- end
57
- end
58
-
59
- context "#get_by_id" do
60
- it 'should return the value for a given id' do
61
- store.set 1, 'Name 1'
62
- store.get_by_id(1).should == [1, 'Name 1']
63
- end
64
-
65
- it 'should return nil when id not found' do
66
- store.get_by_id(1).should be_nil
67
- end
68
-
69
- it 'should return value for correct enum' do
70
- alt_store.set 1, 'Other Name 1'
71
- store.set 1, 'Name 1'
72
- store.get_by_id(1).should == [1, 'Name 1']
73
- end
74
- end
75
-
76
- context "#get_by_name" do
77
- it 'should return the value for a given name' do
78
- store.set 1, 'Name 1'
79
- store.get_by_name('Name 1').should == [1, 'Name 1']
80
- end
81
-
82
- it 'should return the value with title-cased name for a given lowercase name' do
83
- store.set 1, 'Name 1'
84
- store.get_by_name('name 1').should == [1, 'Name 1']
85
- end
86
-
87
- it 'should return nil when name not found' do
88
- store.get_by_name('test name').should be_nil
89
- end
90
-
91
- it 'should return value for correct enum' do
92
- alt_store.set 1, 'Other Name 1'
93
- store.set 1, 'Name 1'
94
- store.get_by_name('Name 1').should == [1, 'Name 1']
95
- end
96
- end
97
-
98
- context "sort!" do
99
- it 'should sort values ascending when passed :asc' do
100
- @order = :asc
101
- store.set 2, 'Name 2'
102
- store.set 1, 'Name 1'
103
- store.values.should == [[1,'Name 1'], [2, 'Name 2']]
104
- end
105
-
106
- it 'should sort values descending when passed :desc' do
107
- @order = :desc
108
- store.set 1, 'Name 1'
109
- store.set 2, 'Name 2'
110
- store.values.should == [[2, 'Name 2'], [1,'Name 1']]
111
- end
112
-
113
- it 'should not sort values when passed :as_defined' do
114
- @order = :as_defined
115
- store.set 1, 'Name 1'
116
- store.set 3, 'Name 3'
117
- store.set 2, 'Name 2'
118
- store.values.should == [[1,'Name 1'], [3,'Name 3'], [2, 'Name 2']]
119
- end
120
- end
121
-
122
- after do
123
- ActiveEnum::Model.delete_all
124
- end
125
-
126
- def store
127
- @store ||= ActiveEnum::Storage::ActiveRecordStore.new(TestARStoreEnum, @order)
128
- end
129
-
130
- def alt_store
131
- @alt_store ||= ActiveEnum::Storage::ActiveRecordStore.new(TestOtherAREnum, :asc)
132
- end
133
- end