classy_enum 0.7.0 → 0.7.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/Gemfile CHANGED
@@ -2,6 +2,10 @@ source :rubygems
2
2
 
3
3
  gem 'rails', '~> 3.0'
4
4
 
5
+ group :development do
6
+ gem 'jeweler', '1.4.0'
7
+ end
8
+
5
9
  group :test do
6
10
  gem 'rspec', '~> 2.0'
7
11
  gem 'rspec-rails', '~> 2.0'
data/Gemfile.lock CHANGED
@@ -39,7 +39,14 @@ GEM
39
39
  actionpack (>= 2.3.0)
40
40
  activesupport (>= 2.3.0)
41
41
  i18n (>= 0.4.0)
42
+ gemcutter (0.6.1)
43
+ git (1.2.5)
42
44
  i18n (0.4.1)
45
+ jeweler (1.4.0)
46
+ gemcutter (>= 0.1.0)
47
+ git (>= 1.2.5)
48
+ rubyforge (>= 2.0.0)
49
+ json_pure (1.5.1)
43
50
  linecache (0.43)
44
51
  mail (2.2.7)
45
52
  activesupport (>= 2.3.6)
@@ -83,6 +90,8 @@ GEM
83
90
  ruby-debug-base (~> 0.10.4.0)
84
91
  ruby-debug-base (0.10.4)
85
92
  linecache (>= 0.3)
93
+ rubyforge (2.0.4)
94
+ json_pure (>= 1.1.7)
86
95
  sqlite3-ruby (1.3.1)
87
96
  thor (0.14.3)
88
97
  treetop (1.4.8)
@@ -94,6 +103,7 @@ PLATFORMS
94
103
 
95
104
  DEPENDENCIES
96
105
  formtastic (~> 1.1)
106
+ jeweler (= 1.4.0)
97
107
  rails (~> 3.0)
98
108
  rspec (~> 2.0)
99
109
  rspec-rails (~> 2.0)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.7.1
data/classy_enum.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{classy_enum}
8
- s.version = "0.7.0"
8
+ s.version = "0.7.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Peter Brown"]
12
- s.date = %q{2011-01-29}
12
+ s.date = %q{2011-02-06}
13
13
  s.description = %q{A utility that adds class based enum functionality to ActiveRecord attributes}
14
14
  s.email = %q{github@lette.us}
15
15
  s.extra_rdoc_files = [
@@ -31,6 +31,9 @@ Gem::Specification.new do |s|
31
31
  "init.rb",
32
32
  "lib/classy_enum.rb",
33
33
  "lib/classy_enum/attributes.rb",
34
+ "lib/classy_enum/base.rb",
35
+ "lib/classy_enum/class_methods.rb",
36
+ "lib/classy_enum/instance_methods.rb",
34
37
  "lib/classy_enum/semantic_form_builder.rb",
35
38
  "lib/generators/classy_enum/classy_enum_generator.rb",
36
39
  "lib/generators/classy_enum/templates/enum.rb",
@@ -42,7 +45,7 @@ Gem::Specification.new do |s|
42
45
  s.homepage = %q{http://github.com/beerlington/classy_enum}
43
46
  s.rdoc_options = ["--charset=UTF-8"]
44
47
  s.require_paths = ["lib"]
45
- s.rubygems_version = %q{1.4.2}
48
+ s.rubygems_version = %q{1.5.0}
46
49
  s.summary = %q{A class based enumerator utility for Ruby on Rails}
47
50
  s.test_files = [
48
51
  "spec/classy_enum_attributes_spec.rb",
@@ -18,26 +18,24 @@ module ClassyEnum
18
18
  # class Alarm < ActiveRecord::Base
19
19
  # classy_enum_attr :priority, :alarm_priority
20
20
  # end
21
- def classy_enum_attr(klass, method=nil)
21
+ def classy_enum_attr(enum, attribute=nil)
22
22
 
23
- method ||= klass
23
+ attribute ||= enum
24
24
 
25
- klass = klass.to_s.camelize.constantize
25
+ klass = enum.to_s.camelize.constantize
26
26
 
27
27
  self.instance_eval do
28
28
 
29
29
  # Add ActiveRecord validation to ensure it won't be saved unless it's an option
30
- validates_each [method], :allow_nil => true do |record, attr_name, value|
31
- record.errors.add(attr_name, "must be one of #{klass.all.map(&:to_sym).join(', ')}") unless klass.all.map(&:to_s).include? value.to_s
32
- end
30
+ validates_inclusion_of attribute, :in => klass.all, :message => "must be one of #{klass.valid_options}"
33
31
 
34
32
  # Define getter method that returns a ClassyEnum instance
35
- define_method method do
33
+ define_method attribute do
36
34
  klass.build(super())
37
35
  end
38
36
 
39
37
  # Define setter method that accepts either string or symbol for member
40
- define_method "#{method}=" do |value|
38
+ define_method "#{attribute}=" do |value|
41
39
  super(value.to_s)
42
40
  end
43
41
 
@@ -0,0 +1,52 @@
1
+ module ClassyEnum
2
+
3
+ class Base
4
+
5
+ # Macro for defining enum members within a ClassyEnum class.
6
+ # Accepts an array of symbols or strings which are converted to
7
+ # ClassyEnum members as descents of their parent class.
8
+ #
9
+ # ==== Example
10
+ # # Define an enum called Priority with three child classes
11
+ # class Priority < ClassyEnum::Base
12
+ # enum_classes :low, :medium, :high
13
+ # end
14
+ #
15
+ # The child classes will be defined with the following constants:
16
+ # PriorityLow, PriorityMedium, and PriorityHigh
17
+ #
18
+ # These child classes can be instantiated with either:
19
+ # Priority.build(:low) or PriorityLow.new
20
+ #
21
+ def self.enum_classes(*options)
22
+ self.const_set("OPTIONS", options) unless self.const_defined? "OPTIONS"
23
+
24
+ self.extend ClassyEnum::ClassMethods
25
+ self.send(:include, ClassyEnum::InstanceMethods)
26
+ self.send(:include, Comparable)
27
+
28
+ options.each_with_index do |option, index|
29
+
30
+ klass = Class.new(self) do
31
+ @index = index + 1
32
+ @option = option
33
+
34
+ def initialize
35
+ @to_s = self.class.instance_variable_get('@option').to_s
36
+ @index = self.class.instance_variable_get('@index')
37
+ end
38
+
39
+ # Define methods to test member type (ie member.option?)
40
+ options.each do |o|
41
+ self.send(:define_method, "#{o}?", lambda { o == option })
42
+ end
43
+
44
+ end
45
+
46
+ klass_name = "#{self}#{option.to_s.camelize}"
47
+ Object.const_set(klass_name, klass) unless Object.const_defined? klass_name
48
+ end
49
+ end
50
+ end
51
+
52
+ end
@@ -0,0 +1,63 @@
1
+ module ClassyEnum
2
+ module ClassMethods
3
+
4
+ # Build a new ClassyEnum child instance
5
+ #
6
+ # ==== Example
7
+ # # Create an Enum with some elements
8
+ # class Priority < ClassyEnum::Base
9
+ # enum_classes :low, :medium, :high
10
+ # end
11
+ #
12
+ # Priority.build(:low) # => PriorityLow.new
13
+ def build(option)
14
+ return option if option.blank?
15
+ return TypeError.new("Valid #{self} options are #{self.valid_options}") unless self::OPTIONS.include? option.to_sym
16
+ Object.const_get("#{self}#{option.to_s.camelize}").new
17
+ end
18
+
19
+ alias :find :build
20
+
21
+ # Returns an array of all instantiated enums
22
+ #
23
+ # ==== Example
24
+ # # Create an Enum with some elements
25
+ # class Priority < ClassyEnum::Base
26
+ # enum_classes :low, :medium, :high
27
+ # end
28
+ #
29
+ # Priority.all # => [PriorityLow.new, PriorityMedium.new, PriorityHigh.new]
30
+ def all
31
+ self::OPTIONS.map {|e| build(e) }
32
+ end
33
+
34
+ # Returns a 2D array for Rails select helper options.
35
+ # Also used internally for Formtastic support
36
+ #
37
+ # ==== Example
38
+ # # Create an Enum with some elements
39
+ # class Priority < ClassyEnum::Base
40
+ # enum_classes :low, :really_high
41
+ # end
42
+ #
43
+ # Priority.select_options # => [["Low", "low"], ["Really High", "really_high"]]
44
+ def select_options
45
+ all.map {|e| [e.name, e.to_s] }
46
+ end
47
+
48
+ # Returns a comma separated list of valid enum options.
49
+ # Also used internally for ActiveRecord model validation error messages
50
+ #
51
+ # ==== Example
52
+ # # Create an Enum with some elements
53
+ # class Priority < ClassyEnum::Base
54
+ # enum_classes :low, :medium, :high
55
+ # end
56
+ #
57
+ # Priority.valid_options # => "low, medium, high"
58
+ def valid_options
59
+ self::OPTIONS.map(&:to_s).join(', ')
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,105 @@
1
+ module ClassyEnum
2
+ module InstanceMethods
3
+ # Returns an integer representing the order that this element was defined in.
4
+ # Also used internally for sorting.
5
+ #
6
+ # ==== Example
7
+ # # Create an Enum with some elements
8
+ # class Priority < ClassyEnum::Base
9
+ # enum_classes :low, :medium, :high
10
+ # end
11
+ #
12
+ # @priority = PriorityMedium.new
13
+ # @priority.index # => 2
14
+ def index
15
+ @index
16
+ end
17
+
18
+ alias :to_i :index
19
+
20
+ # Returns the name or string corresponding to element
21
+ #
22
+ # ==== Example
23
+ # # Create an Enum with some elements
24
+ # class Priority < ClassyEnum::Base
25
+ # enum_classes :low, :medium, :high
26
+ # end
27
+ #
28
+ # @priority = PriorityLow.new
29
+ # @priority.to_s # => 'low'
30
+ def to_s
31
+ @to_s
32
+ end
33
+
34
+ # Returns a Symbol corresponding to a string representation of element,
35
+ # creating the symbol if it did not previously exist
36
+ #
37
+ # ==== Example
38
+ # # Create an Enum with some elements
39
+ # class Priority < ClassyEnum::Base
40
+ # enum_classes :low, :medium, :high
41
+ # end
42
+ #
43
+ # @priority = PriorityLow.new
44
+ # @priority.to_sym # => :low
45
+ def to_sym
46
+ @to_s.to_sym
47
+ end
48
+
49
+ # Returns string representing enum in Rails titleize format
50
+ #
51
+ # ==== Example
52
+ # # Create an Enum with some elements
53
+ # class Priority < ClassyEnum::Base
54
+ # enum_classes :low, :medium, :high, :really_high
55
+ # end
56
+ #
57
+ # @priority = Priority.build(:really_high)
58
+ # @priority.name # => "Really High"
59
+ def name
60
+ @to_s.titleize
61
+ end
62
+
63
+ # Sort an array of elements based on the order they are defined
64
+ #
65
+ # ==== Example
66
+ # # Create an Enum with some elements
67
+ # class Priority < ClassyEnum::Base
68
+ # enum_classes :low, :medium, :high
69
+ # end
70
+ #
71
+ # @low = Priority.build(:low)
72
+ # @medium = Priority.build(:medium)
73
+ # @high = Priority.build(:high)
74
+ # priorities = [@low, @high, @medium]
75
+ # priorities.sort # => [@low, @medium, @high]
76
+ # priorities.max # => @high
77
+ # priorities.min # => @low
78
+ def <=> other
79
+ @index <=> other.index
80
+ end
81
+
82
+ # Determine if the enum attribute is a particular member.
83
+ # Accepts a symbol or string representing a member
84
+ #
85
+ # ==== Example
86
+ # # Create an Enum with some elements
87
+ # class Breed < ClassyEnum::Base
88
+ # enum_classes :golden_retriever, :snoop
89
+ # end
90
+ #
91
+ # # Create an ActiveRecord class using the Breed enum
92
+ # class Dog < ActiveRecord::Base
93
+ # classy_enum_attr :breed
94
+ # end
95
+ #
96
+ # @dog = Dog.new(:breed => :snoop)
97
+ # @dog.breed.is? :snoop # => true
98
+ # @dog.breed.is? 'snoop' # => true
99
+ # @dog.breed.is? :golden_retriever # => false
100
+ def is?(obj)
101
+ obj.to_s == to_s
102
+ end
103
+
104
+ end
105
+ end
@@ -7,7 +7,7 @@ module ClassyEnum
7
7
  enum_class = (options[:enum_class] || method).to_s.classify.constantize rescue Error.invalid_classy_enum_object(method)
8
8
  options[:collection] = enum_class.select_options
9
9
  else
10
- Error.invalid_classy_enum_object unless enum_class.respond_to? :enum_classes
10
+ Error.invalid_classy_enum_object(method) unless enum_class.is_a? ClassyEnum::Base
11
11
  options[:collection] = enum_class.class.superclass.select_options
12
12
  options[:selected] = enum_class.to_s
13
13
  end
@@ -20,7 +20,7 @@ module ClassyEnum
20
20
 
21
21
  module Error # :nodoc: all
22
22
  def self.invalid_classy_enum_object(method)
23
- raise "#{method} is not a ClassyEnum object"
23
+ raise "#{method} is not a ClassyEnum object. Make sure you've added 'classy_enum_attr :#{method}' to your model"
24
24
  end
25
25
  end
26
26
  end
data/lib/classy_enum.rb CHANGED
@@ -1,179 +1,9 @@
1
+ require "classy_enum/base"
2
+ require "classy_enum/class_methods"
3
+ require "classy_enum/instance_methods"
1
4
  require "classy_enum/attributes"
2
5
 
3
6
  if Gem.available? 'formtastic'
4
7
  require 'formtastic'
5
8
  require 'classy_enum/semantic_form_builder'
6
9
  end
7
-
8
- module ClassyEnum
9
-
10
- class Base
11
-
12
- # Macro for defining enum members within a ClassyEnum class.
13
- # Accepts an array of symbols or strings which are converted to
14
- # ClassyEnum members as descents of their parent class.
15
- #
16
- # ==== Example
17
- # # Define an enum called Priority with three child classes
18
- # class Priority < ClassyEnum::Base
19
- # enum_classes :low, :medium, :high
20
- # end
21
- #
22
- # The child classes will be defined with the following constants:
23
- # PriorityLow, PriorityMedium, and PriorityHigh
24
- #
25
- # These child classes can be instantiated with either:
26
- # Priority.build(:low) or PriorityLow.new
27
- #
28
- def self.enum_classes(*options)
29
- self.send(:attr_reader, :enum_classes)
30
-
31
- self.const_set("OPTIONS", options) unless self.const_defined? "OPTIONS"
32
-
33
- self.extend ClassMethods
34
-
35
- options.each_with_index do |option, index|
36
-
37
- klass = Class.new(self) do
38
- include InstanceMethods
39
-
40
- attr_reader :to_s, :to_sym, :index
41
-
42
- @index = index + 1
43
- @option = option
44
-
45
- def initialize
46
- @to_s = self.class.instance_variable_get('@option').to_s
47
- @to_sym = @to_s.to_sym
48
- @index = self.class.instance_variable_get('@index')
49
- end
50
-
51
- end
52
-
53
- klass_name = "#{self}#{option.to_s.camelize}"
54
- Object.const_set(klass_name, klass) unless Object.const_defined? klass_name
55
- end
56
- end
57
- end
58
-
59
- module ClassMethods
60
-
61
- # Build a new ClassyEnum child instance
62
- #
63
- # ==== Example
64
- # # Create an Enum with some elements
65
- # class Priority < ClassyEnum::Base
66
- # enum_classes :low, :medium, :high
67
- # end
68
- #
69
- # Priority.build(:low) # => PriorityLow.new
70
- def build(option)
71
- return option if option.blank?
72
- return TypeError.new("Valid #{self} options are #{self.valid_options}") unless self::OPTIONS.include? option.to_sym
73
- Object.const_get("#{self}#{option.to_s.camelize}").new
74
- end
75
-
76
- alias :find :build
77
-
78
- # Returns an array of all instantiated enums
79
- #
80
- # ==== Example
81
- # # Create an Enum with some elements
82
- # class Priority < ClassyEnum::Base
83
- # enum_classes :low, :medium, :high
84
- # end
85
- #
86
- # Priority.all # => [PriorityLow.new, PriorityMedium.new, PriorityHigh.new]
87
- def all
88
- self::OPTIONS.map {|e| build(e) }
89
- end
90
-
91
- # Returns a 2D array for Rails select helper options.
92
- # Also used internally for Formtastic support
93
- #
94
- # ==== Example
95
- # # Create an Enum with some elements
96
- # class Priority < ClassyEnum::Base
97
- # enum_classes :low, :really_high
98
- # end
99
- #
100
- # Priority.select_options # => [["Low", "low"], ["Really High", "really_high"]]
101
- def select_options
102
- all.map {|e| [e.name, e.to_s] }
103
- end
104
-
105
- # Returns a comma separated list of valid enum options.
106
- # Also used internally for ActiveRecord model validation error messages
107
- #
108
- # ==== Example
109
- # # Create an Enum with some elements
110
- # class Priority < ClassyEnum::Base
111
- # enum_classes :low, :medium, :high
112
- # end
113
- #
114
- # Priority.valid_options # => "low, medium, high"
115
- def valid_options
116
- self::OPTIONS.map(&:to_s).join(', ')
117
- end
118
-
119
- end
120
-
121
- module InstanceMethods
122
- # Returns string representing enum in Rails titleize format
123
- #
124
- # ==== Example
125
- # # Create an Enum with some elements
126
- # class Priority < ClassyEnum::Base
127
- # enum_classes :low, :medium, :high, :really_high
128
- # end
129
- #
130
- # @priority = Priority.build(:really_high)
131
- # @priority.name # => "Really High"
132
- def name
133
- @to_s.titleize
134
- end
135
-
136
- # Sort an array of elements based on the order they are defined
137
- #
138
- # ==== Example
139
- # # Create an Enum with some elements
140
- # class Priority < ClassyEnum::Base
141
- # enum_classes :low, :medium, :high
142
- # end
143
- #
144
- # @low = Priority.build(:low)
145
- # @medium = Priority.build(:medium)
146
- # @high = Priority.build(:high)
147
- # priorities = [@low, @high, @medium]
148
- # priorities.sort # => [@low, @medium, @high]
149
- # priorities.max # => @high
150
- # priorities.min # => @low
151
- def <=> other
152
- @index <=> other.index
153
- end
154
-
155
- # Determine if the enum attribute is a particular member.
156
- # Accepts a symbol or string representing a member
157
- #
158
- # ==== Example
159
- # # Create an Enum with some elements
160
- # class Breed < ClassyEnum::Base
161
- # enum_classes :golden_retriever, :snoop
162
- # end
163
- #
164
- # # Create an ActiveRecord class using the Breed enum
165
- # class Dog < ActiveRecord::Base
166
- # classy_enum_attr :breed
167
- # end
168
- #
169
- # @dog = Dog.new(:breed => :snoop)
170
- # @dog.breed.is? :snoop # => true
171
- # @dog.breed.is? 'snoop' # => true
172
- # @dog.breed.is? :golden_retriever # => false
173
- def is?(obj)
174
- obj.to_s == to_s
175
- end
176
-
177
- end
178
-
179
- end
@@ -1,50 +1,34 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
- describe "A Dog Collection" do
4
- before(:each) do
5
- dog1 = Dog.new(:breed => :golden_retriever)
6
- dog2 = Dog.new(:breed => :snoop)
7
-
8
- @dogs = [dog1, dog2]
9
- end
10
-
11
- it "should sort by breed" do
12
- @dogs.sort_by(&:breed).should == @dogs
13
- end
14
- end
15
-
16
3
  describe "A Dog" do
17
4
 
18
- before(:each) { @dog = Dog.new(:breed => :golden_retriever) }
5
+ context "with valid breed options" do
6
+ before { @dog = Dog.new(:breed => :golden_retriever) }
19
7
 
20
- it "should have an enumerable breed" do
21
- @dog.breed.class.should == BreedGoldenRetriever
22
- end
8
+ it "should have a classy enum breed" do
9
+ @dog.breed.should be_a(BreedGoldenRetriever)
10
+ end
23
11
 
24
- it "should respond to enum_classes" do
25
- @dog.breed.should respond_to('enum_classes')
12
+ it "should be valid with a valid option" do
13
+ @dog.should be_valid
14
+ end
26
15
  end
27
16
 
28
- it "should know which member the enum is" do
29
- @dog.breed.is?(:golden_retriever).should be_true
17
+ it "should not be valid with a nil breed" do
18
+ Dog.new(:breed => nil).should_not be_valid
30
19
  end
31
20
 
32
- it "should be valid with a valid option" do
33
- @dog.should be_valid
21
+ it "should not be valid with a blank breed" do
22
+ Dog.new(:breed => "").should_not be_valid
34
23
  end
35
24
 
36
- context "with an invalid breed option" do
37
- before { @dog.breed = :golden_doodle }
25
+ context "with invalid breed options" do
26
+ before { @dog = Dog.new(:breed => :fake_breed) }
38
27
 
39
28
  it "should not be valid with an invalid option" do
40
29
  @dog.should_not be_valid
41
30
  end
42
31
 
43
- it "should have an error for the breed" do
44
- @dog.valid?
45
- @dog.errors.should include(:breed)
46
- end
47
-
48
32
  it "should have an error message containing the right options" do
49
33
  @dog.valid?
50
34
  @dog.errors[:breed].should include("must be one of #{Breed.all.map(&:to_sym).join(', ')}")
@@ -53,18 +37,10 @@ describe "A Dog" do
53
37
 
54
38
  end
55
39
 
56
- class Thing < ActiveRecord::Base
57
- classy_enum_attr :breed, :dog_breed
58
- end
59
-
60
- describe "A Thing" do
61
- before(:each) { @thing = Thing.new(:dog_breed => :snoop) }
62
-
63
- it "should have an enumerable dog breed as breed" do
64
- @thing.dog_breed.class.should == BreedSnoop
65
- end
40
+ describe "A ClassyEnum that has a different field name than the enum" do
41
+ before { @dog = OtherDog.new(:other_breed => :snoop) }
66
42
 
67
- it "should have a base class of Breed" do
68
- @thing.dog_breed.should respond_to('enum_classes')
43
+ it "should have a classy enum breed" do
44
+ @dog.other_breed.should be_a(BreedSnoop)
69
45
  end
70
46
  end
@@ -1,4 +1,4 @@
1
- require "spec/spec_helper"
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe 'using enum_select input' do
4
4
  include FormtasticSpecHelper
@@ -11,69 +11,67 @@ describe 'using enum_select input' do
11
11
  end
12
12
 
13
13
  context "when building a form with a classy_enum select" do
14
- before(:each) do
15
- @output = semantic_form_for(Dog.new(:breed => :snoop), :url => "/") do |builder|
16
- concat(builder.input(:breed, :as => :enum_select))
14
+ context "with an object that has the enum set" do
15
+ before(:each) do
16
+ @output = semantic_form_for(Dog.new(:breed => :snoop), :url => "/") do |builder|
17
+ concat(builder.input(:breed, :as => :enum_select))
18
+ end
17
19
  end
18
- end
19
20
 
20
- it "should produce a form tag" do
21
- @output.should =~ /<form/
22
- end
21
+ it "should produce an unselected option tag for Golden Retriever" do
22
+ regex = Regexp.new("<option value=\\\"golden_retriever\\\">Golden Retriever")
23
+ @output.should =~ regex
24
+ end
23
25
 
24
- it "should produce an unselected option tag for Golden Retriever" do
25
- regex = Regexp.new("<option value=\\\"golden_retriever\\\">Golden Retriever")
26
- @output.should =~ regex
27
- end
26
+ it "should produce a selected option tag for Snoop" do
27
+ regex = Regexp.new("<option value=\\\"snoop\\\" selected=\\\"selected\\\">Snoop")
28
+ @output.should =~ regex
29
+ end
28
30
 
29
- it "should produce an selected option tag for Snoop" do
30
- regex = Regexp.new("<option value=\\\"snoop\\\" selected=\\\"selected\\\">Snoop")
31
- @output.should =~ regex
31
+ it "should not produce a blank selected option tag" do
32
+ regex = Regexp.new("<option value=\"\"><")
33
+ @output.should_not =~ regex
34
+ end
32
35
  end
33
- end
34
36
 
35
- context "when building a form with a classy_enum select, but the existing value is nil" do
36
- before(:each) do
37
- @output = semantic_form_for(Dog.new, :url => "/") do |builder|
38
- concat(builder.input(:other_breed, :as => :enum_select, :enum_class => :breed))
37
+ context "with an object that has a nil enum" do
38
+ before(:each) do
39
+ @output = semantic_form_for(Dog.new, :url => "/") do |builder|
40
+ concat(builder.input(:breed, :as => :enum_select))
41
+ end
39
42
  end
40
- end
41
43
 
42
- it "should produce a form tag" do
43
- @output.should =~ /<form/
44
- end
44
+ it "should produce an unselected option tag for Golden Retriever" do
45
+ regex = Regexp.new("<option value=\\\"golden_retriever\\\">Golden Retriever")
46
+ @output.should =~ regex
47
+ end
45
48
 
46
- it "should produce an unselected option tag for Golden Retriever" do
47
- regex = Regexp.new("<option value=\\\"golden_retriever\\\">Golden Retriever")
48
- @output.should =~ regex
49
- end
49
+ it "should not produce an selected option tag" do
50
+ regex = Regexp.new("selected")
51
+ @output.should_not =~ regex
52
+ end
50
53
 
51
- it "should produce an unselected option tag for Snoop" do
52
- regex = Regexp.new("<option value=\\\"snoop\\\">Snoop")
53
- @output.should =~ regex
54
54
  end
55
- end
56
55
 
57
- context "when building a form with a classy_enum select, using the enum_attr option" do
58
- before(:each) do
59
- @output = semantic_form_for(Dog.new, :url => "/") do |builder|
60
- concat(builder.input(:breed, :as => :enum_select))
56
+ context "with an object with a different attribute name which requires the enum_class" do
57
+ before(:each) do
58
+ @output = semantic_form_for(OtherDog.new, :url => "/") do |builder|
59
+ concat(builder.input(:other_breed, :as => :enum_select, :enum_class => :breed))
60
+ end
61
61
  end
62
- end
63
62
 
64
- it "should produce a form tag" do
65
- @output.should =~ /<form/
66
- end
63
+ it "should produce an unselected option tag for Golden Retriever" do
64
+ regex = Regexp.new("<option value=\\\"golden_retriever\\\">Golden Retriever")
65
+ @output.should =~ regex
66
+ end
67
67
 
68
- it "should produce an unselected option tag for Golden Retriever" do
69
- regex = Regexp.new("<option value=\\\"golden_retriever\\\">Golden Retriever")
70
- @output.should =~ regex
71
- end
68
+ it "should not produce an selected option tag" do
69
+ regex = Regexp.new("selected")
70
+ @output.should_not =~ regex
71
+ end
72
72
 
73
- it "should produce an unselected option tag for Snoop" do
74
- regex = Regexp.new("<option value=\\\"snoop\\\">Snoop")
75
- @output.should =~ regex
76
73
  end
74
+
77
75
  end
78
76
 
79
77
  it "should raise an error if the attribute is not a ClassyEnum object" do
@@ -81,7 +79,7 @@ describe 'using enum_select input' do
81
79
  @output = semantic_form_for(Dog.new(:breed => :snoop), :url => "/") do |builder|
82
80
  concat(builder.input(:id, :as => :enum_select))
83
81
  end
84
- end.should raise_error("id is not a ClassyEnum object")
82
+ end.should raise_error("id is not a ClassyEnum object. Make sure you've added 'classy_enum_attr :id' to your model")
85
83
  end
86
84
 
87
85
  it "should raise an error if the attribute is not a ClassyEnum object and its value is nil" do
@@ -89,7 +87,7 @@ describe 'using enum_select input' do
89
87
  @output = semantic_form_for(Dog.new, :url => "/") do |builder|
90
88
  concat(builder.input(:id, :as => :enum_select))
91
89
  end
92
- end.should raise_error("id is not a ClassyEnum object")
90
+ end.should raise_error("id is not a ClassyEnum object. Make sure you've added 'classy_enum_attr :id' to your model")
93
91
  end
94
92
 
95
93
  end
@@ -81,6 +81,10 @@ describe "A ClassyEnum element" do
81
81
  it "should inherit the default class methods" do
82
82
  TestEnumOne.test_class_method?.should be_false
83
83
  end
84
+
85
+ it "should compare different elements based on their index" do
86
+ TestEnumOne.new.should == TestEnumOne.new
87
+ end
84
88
  end
85
89
 
86
90
  describe "A ClassyEnum instance" do
@@ -90,18 +94,34 @@ describe "A ClassyEnum instance" do
90
94
  @enum.class.should == TestEnumOne
91
95
  end
92
96
 
93
- it "should return true for is_element?(:one)" do
97
+ it "should return true for is?(:one)" do
94
98
  @enum.is?(:one).should be_true
95
99
  end
96
100
 
97
- it "should return true for is_element?('one')" do
101
+ it "should return true for is?('one')" do
98
102
  @enum.is?('one').should be_true
99
103
  end
100
104
 
105
+ it "should return true for one?" do
106
+ @enum.one?.should be_true
107
+ end
108
+
109
+ it "should return false for two?" do
110
+ @enum.two?.should be_false
111
+ end
112
+
101
113
  it "should be a TestEnum" do
102
114
  @enum.should be_a(TestEnum)
103
115
  end
104
116
 
117
+ it "should have an index" do
118
+ @enum.index.should == 1
119
+ end
120
+
121
+ it "should index as to_i" do
122
+ @enum.to_i.should == 1
123
+ end
124
+
105
125
  it "should convert to a string" do
106
126
  @enum.to_s.should == "one"
107
127
  end
data/spec/spec_helper.rb CHANGED
@@ -15,12 +15,12 @@ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":me
15
15
  ActiveRecord::Schema.define(:version => 1) do
16
16
  create_table :dogs, :force => true do |t|
17
17
  t.string :breed
18
- t.string :other_breed
19
18
  end
20
19
 
21
- create_table :things, :force => true do |t|
22
- t.string :dog_breed
20
+ create_table :other_dogs, :force => true do |t|
21
+ t.string :other_breed
23
22
  end
23
+
24
24
  end
25
25
 
26
26
  class Breed < ClassyEnum::Base
@@ -29,6 +29,9 @@ end
29
29
 
30
30
  class Dog < ActiveRecord::Base
31
31
  classy_enum_attr :breed
32
+ end
33
+
34
+ class OtherDog < ActiveRecord::Base
32
35
  classy_enum_attr :breed, :other_breed
33
36
  end
34
37
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: classy_enum
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 1
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 7
9
- - 0
10
- version: 0.7.0
9
+ - 1
10
+ version: 0.7.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Peter Brown
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-29 00:00:00 -05:00
18
+ date: 2011-02-06 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -116,6 +116,9 @@ files:
116
116
  - init.rb
117
117
  - lib/classy_enum.rb
118
118
  - lib/classy_enum/attributes.rb
119
+ - lib/classy_enum/base.rb
120
+ - lib/classy_enum/class_methods.rb
121
+ - lib/classy_enum/instance_methods.rb
119
122
  - lib/classy_enum/semantic_form_builder.rb
120
123
  - lib/generators/classy_enum/classy_enum_generator.rb
121
124
  - lib/generators/classy_enum/templates/enum.rb
@@ -153,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
156
  requirements: []
154
157
 
155
158
  rubyforge_project:
156
- rubygems_version: 1.4.2
159
+ rubygems_version: 1.5.0
157
160
  signing_key:
158
161
  specification_version: 3
159
162
  summary: A class based enumerator utility for Ruby on Rails