classy_enum 1.4.0 → 2.0.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/.travis.yml CHANGED
@@ -2,3 +2,7 @@ rvm:
2
2
  - 1.8.7
3
3
  - 1.9.2
4
4
  - 1.9.3
5
+ gemfile:
6
+ - gemfiles/Gemfile.rails-3.0.x
7
+ - gemfiles/Gemfile.rails-3.1.x
8
+ - gemfiles/Gemfile.rails-3.2.x
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # ClassyEnum Changelog
2
2
 
3
+ ## 2.0.0
4
+
5
+ * Enum class definitions are no longer defined implicity and must be explicitly subclassed from children of ClassyEnum::Base
6
+ * Formtastic support is not longer built-in. See https://github.com/beerlington/classy_enum/wiki/Formtastic-Support
7
+ * validates_uniqueness_of with an enum scope no longer works in Rails
8
+ 3.0.x (no changes for Rails 3.1 or 3.2)
9
+
3
10
  ## 1.3.2
4
11
 
5
12
  * Added support for Ruby 1.9.3
data/Gemfile CHANGED
@@ -1,11 +1,11 @@
1
1
  source :rubygems
2
2
 
3
- gem 'rails', '>= 3.0.0'
3
+ gem 'rails', '~> 3.2.0'
4
4
 
5
5
  group :development do
6
6
  gem "jeweler", "~> 1.6.2"
7
7
  gem "rspec-rails", "~> 2.8.1"
8
- gem 'formtastic', '~> 1.2.4'
9
- gem 'sqlite3-ruby', :require => 'sqlite3'
8
+ gem 'sqlite3'
9
+ gem 'json', '~> 1.6.5'
10
10
  # gem 'ruby-debug19', :require => 'false'
11
11
  end
data/Gemfile.lock CHANGED
@@ -1,74 +1,78 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- abstract (1.0.0)
5
- actionmailer (3.0.5)
6
- actionpack (= 3.0.5)
7
- mail (~> 2.2.15)
8
- actionpack (3.0.5)
9
- activemodel (= 3.0.5)
10
- activesupport (= 3.0.5)
11
- builder (~> 2.1.2)
12
- erubis (~> 2.6.6)
13
- i18n (~> 0.4)
14
- rack (~> 1.2.1)
15
- rack-mount (~> 0.6.13)
16
- rack-test (~> 0.5.7)
17
- tzinfo (~> 0.3.23)
18
- activemodel (3.0.5)
19
- activesupport (= 3.0.5)
20
- builder (~> 2.1.2)
21
- i18n (~> 0.4)
22
- activerecord (3.0.5)
23
- activemodel (= 3.0.5)
24
- activesupport (= 3.0.5)
25
- arel (~> 2.0.2)
26
- tzinfo (~> 0.3.23)
27
- activeresource (3.0.5)
28
- activemodel (= 3.0.5)
29
- activesupport (= 3.0.5)
30
- activesupport (3.0.5)
31
- arel (2.0.10)
32
- builder (2.1.2)
4
+ actionmailer (3.2.3)
5
+ actionpack (= 3.2.3)
6
+ mail (~> 2.4.4)
7
+ actionpack (3.2.3)
8
+ activemodel (= 3.2.3)
9
+ activesupport (= 3.2.3)
10
+ builder (~> 3.0.0)
11
+ erubis (~> 2.7.0)
12
+ journey (~> 1.0.1)
13
+ rack (~> 1.4.0)
14
+ rack-cache (~> 1.2)
15
+ rack-test (~> 0.6.1)
16
+ sprockets (~> 2.1.2)
17
+ activemodel (3.2.3)
18
+ activesupport (= 3.2.3)
19
+ builder (~> 3.0.0)
20
+ activerecord (3.2.3)
21
+ activemodel (= 3.2.3)
22
+ activesupport (= 3.2.3)
23
+ arel (~> 3.0.2)
24
+ tzinfo (~> 0.3.29)
25
+ activeresource (3.2.3)
26
+ activemodel (= 3.2.3)
27
+ activesupport (= 3.2.3)
28
+ activesupport (3.2.3)
29
+ i18n (~> 0.6)
30
+ multi_json (~> 1.0)
31
+ arel (3.0.2)
32
+ builder (3.0.0)
33
33
  diff-lcs (1.1.3)
34
- erubis (2.6.6)
35
- abstract (>= 1.0.0)
36
- formtastic (1.2.4)
37
- actionpack (>= 2.3.7)
38
- activesupport (>= 2.3.7)
39
- i18n (~> 0.4)
34
+ erubis (2.7.0)
40
35
  git (1.2.5)
36
+ hike (1.2.1)
41
37
  i18n (0.6.0)
42
38
  jeweler (1.6.4)
43
39
  bundler (~> 1.0)
44
40
  git (>= 1.2.5)
45
41
  rake
46
- mail (2.2.19)
47
- activesupport (>= 2.3.6)
42
+ journey (1.0.3)
43
+ json (1.6.6)
44
+ mail (2.4.4)
48
45
  i18n (>= 0.4.0)
49
46
  mime-types (~> 1.16)
50
47
  treetop (~> 1.4.8)
51
- mime-types (1.16)
52
- polyglot (0.3.2)
53
- rack (1.2.5)
54
- rack-mount (0.6.14)
55
- rack (>= 1.0.0)
56
- rack-test (0.5.7)
48
+ mime-types (1.18)
49
+ multi_json (1.3.2)
50
+ polyglot (0.3.3)
51
+ rack (1.4.1)
52
+ rack-cache (1.2)
53
+ rack (>= 0.4)
54
+ rack-ssl (1.3.2)
55
+ rack
56
+ rack-test (0.6.1)
57
57
  rack (>= 1.0)
58
- rails (3.0.5)
59
- actionmailer (= 3.0.5)
60
- actionpack (= 3.0.5)
61
- activerecord (= 3.0.5)
62
- activeresource (= 3.0.5)
63
- activesupport (= 3.0.5)
58
+ rails (3.2.3)
59
+ actionmailer (= 3.2.3)
60
+ actionpack (= 3.2.3)
61
+ activerecord (= 3.2.3)
62
+ activeresource (= 3.2.3)
63
+ activesupport (= 3.2.3)
64
64
  bundler (~> 1.0)
65
- railties (= 3.0.5)
66
- railties (3.0.5)
67
- actionpack (= 3.0.5)
68
- activesupport (= 3.0.5)
65
+ railties (= 3.2.3)
66
+ railties (3.2.3)
67
+ actionpack (= 3.2.3)
68
+ activesupport (= 3.2.3)
69
+ rack-ssl (~> 1.3.2)
69
70
  rake (>= 0.8.7)
70
- thor (~> 0.14.4)
71
+ rdoc (~> 3.4)
72
+ thor (~> 0.14.6)
71
73
  rake (0.9.2.2)
74
+ rdoc (3.12)
75
+ json (~> 1.4)
72
76
  rspec (2.8.0)
73
77
  rspec-core (~> 2.8.0)
74
78
  rspec-expectations (~> 2.8.0)
@@ -82,19 +86,24 @@ GEM
82
86
  activesupport (>= 3.0)
83
87
  railties (>= 3.0)
84
88
  rspec (~> 2.8.0)
85
- sqlite3-ruby (1.3.1)
89
+ sprockets (2.1.2)
90
+ hike (~> 1.2)
91
+ rack (~> 1.0)
92
+ tilt (~> 1.1, != 1.3.0)
93
+ sqlite3 (1.3.5)
86
94
  thor (0.14.6)
95
+ tilt (1.3.3)
87
96
  treetop (1.4.10)
88
97
  polyglot
89
98
  polyglot (>= 0.3.1)
90
- tzinfo (0.3.31)
99
+ tzinfo (0.3.33)
91
100
 
92
101
  PLATFORMS
93
102
  ruby
94
103
 
95
104
  DEPENDENCIES
96
- formtastic (~> 1.2.4)
97
105
  jeweler (~> 1.6.2)
98
- rails (>= 3.0.0)
106
+ json (~> 1.6.5)
107
+ rails (~> 3.2.0)
99
108
  rspec-rails (~> 2.8.1)
100
- sqlite3-ruby
109
+ sqlite3
data/README.md CHANGED
@@ -20,9 +20,22 @@ The gem is hosted at [rubygems.org](https://rubygems.org/gems/classy_enum)
20
20
 
21
21
  You will also need to add `app/enums` as an autoloadable path. This configuration will depend on which version of rails you are using.
22
22
 
23
+ ## Upgrading to 2.0
24
+
25
+ Prior to 2.0, enum classes were implicity defined and were only required
26
+ when overriding methods or properties. As of 2.0, all enum classes must
27
+ explicity subclass a child of ClassyEnum::Base. If you used the
28
+ generator, there are no changes to the existing structure.
29
+
30
+ Built-in Formtastic support has been removed. See the note at the
31
+ bottom of this readme for more information how how to enable it.
32
+
33
+ validates_uniqueness_of will no longer work with Rails 3.0.x when using
34
+ a scope that is the enum field.
35
+
23
36
  ## Example Usage
24
37
 
25
- The most common use for ClassyEnum is to replace database lookup tables where the content and behavior is mostly static and has multiple "types". In this example, I have an ActiveRecord model called `Alarm` with an attribute called `priority`. Priority is stored as a string (VARCHAR) type in the database and is converted to an enum value when requested.
38
+ The most common use for ClassyEnum is to replace database lookup tables where the content and behavior is mostly static and has multiple "types". In this example, I have an ActiveRecord model called `Alarm` with an attribute called `priority`. Priority is stored as a string (VARCHAR) type in the database and is converted to an enum value when requested.
26
39
 
27
40
  ### 1. Generate the Enum
28
41
 
@@ -49,13 +62,13 @@ class PriorityHigh < Priority
49
62
  end
50
63
  ```
51
64
 
52
- The `enum_classes` macro will add all the ClassyEnum behavior, which is described further down in this document.
65
+ The `enum_classes` class macro will define the enum member order as well as additional ClassyEnum behavior, which is described further down in this document.
53
66
 
54
67
  ### 2. Customize the Enum
55
68
 
56
69
  The generator creates a default setup, but each enum member can be changed to fit your needs.
57
70
 
58
- Using the `enum_classes` method, I have defined three priority levels: low, medium, and high. Each priority level can have different properties and methods associated with it.
71
+ I have defined three priority levels: low, medium, and high. Each priority level can have different properties and methods associated with it.
59
72
 
60
73
  I would like to add a method called `send_email?` that all member subclasses respond to. By default this method will return false, but will be overridden for high priority alarms to return true.
61
74
 
@@ -68,6 +81,12 @@ class Priority < ClassyEnum::Base
68
81
  end
69
82
  end
70
83
 
84
+ class prioritylow < priority
85
+ end
86
+
87
+ class prioritymedium < priority
88
+ end
89
+
71
90
  class PriorityHigh < Priority
72
91
  def send_email?
73
92
  true
@@ -75,8 +94,6 @@ class PriorityHigh < Priority
75
94
  end
76
95
  ```
77
96
 
78
- Note: Defining the subclasses within your enum file is only required when you will be overriding behavior and/or properties. The member subclasses still exist without being defined here because `ClassyEnum.enum_classes` automatically creates a class for each member. The generator only creates these subclass definitions for convenience, but they can be deleted as shown in this example.
79
-
80
97
  ### 3. Setup the ActiveRecord model
81
98
 
82
99
  My ActiveRecord Alarm model needs a text field that will store a string representing the enum member. An example model schema might look something like:
@@ -131,6 +148,12 @@ class Priority < ClassyEnum::Base
131
148
  owner :alarm
132
149
  end
133
150
 
151
+ class prioritylow < priority
152
+ end
153
+
154
+ class prioritymedium < priority
155
+ end
156
+
134
157
  class PriorityHigh < Priority
135
158
  def send_email?
136
159
  alarm.enabled?
@@ -183,7 +206,7 @@ end
183
206
  ```
184
207
 
185
208
  There is an [issue](https://github.com/beerlington/classy_enum/issues/8)
186
- with Rails 3.1 and higher when using validates_uniqueness_of
209
+ with Rails 3.0 and higher when using validates_uniqueness_of
187
210
  and a scope that is the enum field. This issue also occurs when using
188
211
  `composed_of` and is not a bug with ClassyEnum. As a workaround to this
189
212
  problem, you can use the reader suffix option when declaring your field:
@@ -244,11 +267,9 @@ Priority.valid_options # => low, medium, high
244
267
 
245
268
  ## Formtastic Support
246
269
 
247
- To add ClassyEnum support to Formtastic, add the following to your formtastic.rb initializer (config/initializers/formtastic.rb):
248
-
249
- ```ruby
250
- require 'classy_enum/semantic_form_builder'
251
- ```
270
+ Built-in Formtastic support has been removed as of 2.0. It is still
271
+ available but needs to be enabled manually. To enable support visit
272
+ [the wiki](https://github.com/beerlington/classy_enum/wiki/Formtastic-Support)
252
273
 
253
274
  Then in your Formtastic view forms, use this syntax: `<%= f.input :priority, :as => :enum_select %>`
254
275
 
@@ -256,4 +277,4 @@ Note: ClassyEnum respects the `:allow_blank` and `:allow_nil` options and will i
256
277
 
257
278
  ## Copyright
258
279
 
259
- Copyright (c) 2011 [Peter Brown](https://github.com/beerlington). See LICENSE for details.
280
+ Copyright (c) 2012 [Peter Brown](https://github.com/beerlington). See LICENSE for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.4.0
1
+ 2.0.1
data/classy_enum.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "classy_enum"
8
- s.version = "1.4.0"
8
+ s.version = "2.0.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 = "2012-02-05"
12
+ s.date = "2012-04-22"
13
13
  s.description = "A utility that adds class based enum functionality to ActiveRecord attributes"
14
14
  s.email = "github@lette.us"
15
15
  s.extra_rdoc_files = [
@@ -28,50 +28,51 @@ Gem::Specification.new do |s|
28
28
  "Rakefile",
29
29
  "VERSION",
30
30
  "classy_enum.gemspec",
31
+ "gemfiles/Gemfile.rails-3.0.x",
32
+ "gemfiles/Gemfile.rails-3.1.x",
33
+ "gemfiles/Gemfile.rails-3.2.x",
31
34
  "init.rb",
32
35
  "lib/classy_enum.rb",
33
36
  "lib/classy_enum/attributes.rb",
34
37
  "lib/classy_enum/base.rb",
35
38
  "lib/classy_enum/class_methods.rb",
36
39
  "lib/classy_enum/instance_methods.rb",
37
- "lib/classy_enum/semantic_form_builder.rb",
38
40
  "lib/generators/classy_enum/classy_enum_generator.rb",
39
41
  "lib/generators/classy_enum/templates/enum.rb",
40
42
  "spec/active_record_spec.rb",
41
43
  "spec/classy_enum_attributes_spec.rb",
42
44
  "spec/classy_enum_owner_reference_spec.rb",
43
- "spec/classy_enum_semantic_form_builder_spec.rb",
44
45
  "spec/classy_enum_spec.rb",
45
46
  "spec/spec_helper.rb"
46
47
  ]
47
48
  s.homepage = "http://github.com/beerlington/classy_enum"
48
49
  s.licenses = ["MIT"]
49
50
  s.require_paths = ["lib"]
50
- s.rubygems_version = "1.8.15"
51
+ s.rubygems_version = "1.8.19"
51
52
  s.summary = "A class based enumerator utility for Ruby on Rails"
52
53
 
53
54
  if s.respond_to? :specification_version then
54
55
  s.specification_version = 3
55
56
 
56
57
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
57
- s.add_runtime_dependency(%q<rails>, [">= 3.0.0"])
58
+ s.add_runtime_dependency(%q<rails>, ["~> 3.2.0"])
58
59
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
59
60
  s.add_development_dependency(%q<rspec-rails>, ["~> 2.8.1"])
60
- s.add_development_dependency(%q<formtastic>, ["~> 1.2.4"])
61
- s.add_development_dependency(%q<sqlite3-ruby>, [">= 0"])
61
+ s.add_development_dependency(%q<sqlite3>, [">= 0"])
62
+ s.add_development_dependency(%q<json>, ["~> 1.6.5"])
62
63
  else
63
- s.add_dependency(%q<rails>, [">= 3.0.0"])
64
+ s.add_dependency(%q<rails>, ["~> 3.2.0"])
64
65
  s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
65
66
  s.add_dependency(%q<rspec-rails>, ["~> 2.8.1"])
66
- s.add_dependency(%q<formtastic>, ["~> 1.2.4"])
67
- s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
67
+ s.add_dependency(%q<sqlite3>, [">= 0"])
68
+ s.add_dependency(%q<json>, ["~> 1.6.5"])
68
69
  end
69
70
  else
70
- s.add_dependency(%q<rails>, [">= 3.0.0"])
71
+ s.add_dependency(%q<rails>, ["~> 3.2.0"])
71
72
  s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
72
73
  s.add_dependency(%q<rspec-rails>, ["~> 2.8.1"])
73
- s.add_dependency(%q<formtastic>, ["~> 1.2.4"])
74
- s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
74
+ s.add_dependency(%q<sqlite3>, [">= 0"])
75
+ s.add_dependency(%q<json>, ["~> 1.6.5"])
75
76
  end
76
77
  end
77
78
 
@@ -0,0 +1,8 @@
1
+ source :rubygems
2
+
3
+ gem 'rails', '~> 3.0.0'
4
+ gem 'rspec-rails', '~> 2.8.1'
5
+ gem 'formtastic', '~> 1.2.4'
6
+ gem 'sqlite3-ruby', :require => 'sqlite3'
7
+ gem 'json', '~> 1.6.5'
8
+ gem "jeweler", "~> 1.6.2"
@@ -0,0 +1,8 @@
1
+ source :rubygems
2
+
3
+ gem 'rails', '~> 3.1.0'
4
+ gem 'rspec-rails', '~> 2.8.1'
5
+ gem 'formtastic', '~> 1.2.4'
6
+ gem 'sqlite3'
7
+ gem 'json', '~> 1.6.5'
8
+ gem "jeweler", "~> 1.6.2"
@@ -0,0 +1,8 @@
1
+ source :rubygems
2
+
3
+ gem 'rails', '~> 3.2.0'
4
+ gem 'rspec-rails', '~> 2.8.1'
5
+ gem 'formtastic', '~> 1.2.4'
6
+ gem 'sqlite3'
7
+ gem 'json', '~> 1.6.5'
8
+ gem "jeweler", "~> 1.6.2"
@@ -18,24 +18,29 @@ module ClassyEnum
18
18
  # Priority.build(:low) or PriorityLow.new
19
19
  #
20
20
  def enum_classes(*enums)
21
- self.const_set("OPTIONS", enums) unless self.const_defined? "OPTIONS"
21
+ self.class_eval do
22
+ class_attribute :enum_options, :base_class
22
23
 
23
- enums.each_with_index do |option, index|
24
+ self.enum_options = enums.map(&:to_sym)
25
+ self.base_class = self
24
26
 
25
- klass = Class.new(self) do
26
- @index = index + 1
27
- @option = option
27
+ # # Use ActiveModel::AttributeMethods to define attribute? methods
28
+ attribute_method_suffix '?'
29
+ define_attribute_methods enums
30
+ end
31
+ end
28
32
 
29
- attr_accessor :owner, :serialize_as_json
33
+ def inherited(klass)
34
+ return if self == ClassyEnum::Base
30
35
 
31
- # Use ActiveModel::AttributeMethods to define attribute? methods
32
- attribute_method_suffix '?'
33
- define_attribute_methods enums
36
+ enum = klass.name.gsub(klass.base_class.name, '').underscore.to_sym
37
+ index = self.enum_options.index(enum) + 1
34
38
 
35
- end
39
+ klass.class_eval do
40
+ @index = index
41
+ @option = enum
36
42
 
37
- klass_name = "#{self}#{option.to_s.camelize}"
38
- Object.const_set(klass_name, klass) unless Object.const_defined? klass_name
43
+ attr_accessor :owner, :serialize_as_json
39
44
  end
40
45
  end
41
46
 
@@ -50,9 +55,9 @@ module ClassyEnum
50
55
  # Priority.build(:low) # => PriorityLow.new
51
56
  def build(value, options={})
52
57
  return value if value.blank?
53
- return TypeError.new("Valid #{self} options are #{self.valid_options}") unless self::OPTIONS.include? value.to_sym
58
+ return TypeError.new("Valid #{self} options are #{self.valid_options}") unless self.enum_options.include? value.to_sym
54
59
 
55
- object = Object.const_get("#{self}#{value.to_s.camelize}").new
60
+ object = ("#{self}#{value.to_s.camelize}").constantize.new
56
61
  object.owner = options[:owner]
57
62
  object.serialize_as_json = options[:serialize_as_json]
58
63
  object
@@ -70,7 +75,7 @@ module ClassyEnum
70
75
  #
71
76
  # Priority.all # => [PriorityLow.new, PriorityMedium.new, PriorityHigh.new]
72
77
  def all
73
- self::OPTIONS.map {|e| build(e) }
78
+ self.enum_options.map {|e| build(e) }
74
79
  end
75
80
 
76
81
  # Returns a 2D array for Rails select helper options.
@@ -98,10 +103,10 @@ module ClassyEnum
98
103
  #
99
104
  # Priority.valid_options # => "low, medium, high"
100
105
  def valid_options
101
- self::OPTIONS.map(&:to_s).join(', ')
106
+ self.enum_options.map(&:to_s).join(', ')
102
107
  end
103
108
 
104
- private
109
+ private
105
110
 
106
111
  # DSL setter method for reference to enum owner
107
112
  def owner(owner)
@@ -79,17 +79,6 @@ module ClassyEnum
79
79
  index <=> other.index
80
80
  end
81
81
 
82
- # Used by ActiveRecord::PredicateBuilder when building from a hash
83
- def is_a?(klass)
84
- return true if klass == ActiveRecord::Base
85
- super(klass)
86
- end
87
-
88
- # Used by ActiveRecord::PredicateBuilder when building from a hash
89
- def id
90
- to_s
91
- end
92
-
93
82
  # Overrides as_json to remove owner reference recursion issues
94
83
  def as_json(options=nil)
95
84
  return to_s unless serialize_as_json
@@ -9,6 +9,18 @@ class CatBreed < ClassyEnum::Base
9
9
  end
10
10
  end
11
11
 
12
+ class CatBreedAbyssian < CatBreed
13
+ end
14
+
15
+ class CatBreedBengal < CatBreed
16
+ end
17
+
18
+ class CatBreedBirman < CatBreed
19
+ end
20
+
21
+ class CatBreedPersian < CatBreed
22
+ end
23
+
12
24
  class Cat < ActiveRecord::Base
13
25
  classy_enum_attr :breed, :enum => :cat_breed
14
26
  attr_accessor :color
@@ -31,11 +43,11 @@ describe Cat do
31
43
  end
32
44
 
33
45
  it 'should correctly serialize without the owner reference' do
34
- abyssian.to_json.should == "{\"cat\":{\"breed\":\"abyssian\"}}"
46
+ JSON.parse(abyssian.to_json)['cat']['breed'].should == 'abyssian'
35
47
  end
36
48
 
37
49
  it 'should convert the enum to a string when serializing' do
38
- persian.to_json.should == "{\"other_cat\":{\"breed\":{}}}"
50
+ JSON.parse(persian.to_json)['other_cat']['breed'].should be_a(Hash)
39
51
  end
40
52
 
41
53
  end
@@ -12,7 +12,10 @@ class TestEnum < ClassyEnum::Base
12
12
  end
13
13
  end
14
14
 
15
- class TestEnumTwo
15
+ class TestEnumOne < TestEnum
16
+ end
17
+
18
+ class TestEnumTwo < TestEnum
16
19
  def self.test_class_method?
17
20
  true
18
21
  end
@@ -22,20 +25,17 @@ class TestEnumTwo
22
25
  end
23
26
  end
24
27
 
25
- describe "A ClassyEnum Descendent" do
28
+ class TestEnumThree < TestEnum
29
+ end
26
30
 
27
- TestEnum::OPTIONS.each do |option|
28
- it "should define a TestEnum#{option.to_s.capitalize} class" do
29
- Object.const_defined?("TestEnum#{option.to_s.capitalize}").should be_true
30
- end
31
- end
31
+ describe "A ClassyEnum Descendent" do
32
32
 
33
33
  it "should return an array of enums" do
34
34
  TestEnum.all.map(&:class).should == [TestEnumOne, TestEnumTwo, TestEnumThree]
35
35
  end
36
36
 
37
37
  it "should return an array of enums for a select tag" do
38
- TestEnum.select_options.should == TestEnum::OPTIONS.map {|o| [TestEnum.build(o).name, TestEnum.build(o).to_s] }
38
+ TestEnum.select_options.should == TestEnum.enum_options.map {|o| [TestEnum.build(o).name, TestEnum.build(o).to_s] }
39
39
  end
40
40
 
41
41
  it "should return a type error when adding an invalid option" do
data/spec/spec_helper.rb CHANGED
@@ -3,11 +3,8 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
3
 
4
4
  require 'rubygems'
5
5
  require 'active_record'
6
- require 'active_support'
7
- require 'action_pack'
8
6
  require 'action_view'
9
7
  require 'action_controller'
10
- require 'formtastic'
11
8
  require 'rspec/rails'
12
9
  require 'classy_enum'
13
10
 
@@ -53,6 +50,15 @@ class Breed < ClassyEnum::Base
53
50
  enum_classes :golden_retriever, :snoop, :husky
54
51
  end
55
52
 
53
+ class BreedGoldenRetriever < Breed
54
+ end
55
+
56
+ class BreedSnoop < Breed
57
+ end
58
+
59
+ class BreedHusky < Breed
60
+ end
61
+
56
62
  class Dog < ActiveRecord::Base
57
63
  classy_enum_attr :breed
58
64
  end
@@ -68,31 +74,3 @@ end
68
74
  class OtherDog < ActiveRecord::Base
69
75
  classy_enum_attr :other_breed, :enum => :breed
70
76
  end
71
-
72
- module FormtasticSpecHelper
73
- include ActionView::Context if defined?(ActionView::Context)
74
- include ActionController::RecordIdentifier
75
- include ActionView::Helpers::FormHelper
76
- include ActionView::Helpers::FormTagHelper
77
- include ActionView::Helpers::FormOptionsHelper
78
- include Formtastic::SemanticFormHelper
79
-
80
- def self.included(base)
81
- base.class_eval do
82
-
83
- attr_accessor :output_buffer
84
-
85
- def protect_against_forgery?
86
- false
87
- end
88
-
89
- end
90
- end
91
-
92
- end
93
-
94
- module ActionView
95
- class OutputBuffer < ActiveSupport::SafeBuffer
96
- end
97
- end
98
-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: classy_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 2.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-05 00:00:00.000000000Z
12
+ date: 2012-04-22 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &70293149209880 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 3.0.0
21
+ version: 3.2.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70293149209880
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 3.2.0
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: jeweler
27
- requirement: &70293149209000 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 1.6.2
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70293149209000
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.6.2
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: rspec-rails
38
- requirement: &70293149208180 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
@@ -43,29 +53,44 @@ dependencies:
43
53
  version: 2.8.1
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70293149208180
47
- - !ruby/object:Gem::Dependency
48
- name: formtastic
49
- requirement: &70293149207360 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
50
57
  none: false
51
58
  requirements:
52
59
  - - ~>
53
60
  - !ruby/object:Gem::Version
54
- version: 1.2.4
61
+ version: 2.8.1
62
+ - !ruby/object:Gem::Dependency
63
+ name: sqlite3
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70293149207360
58
- - !ruby/object:Gem::Dependency
59
- name: sqlite3-ruby
60
- requirement: &70293149206540 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
61
73
  none: false
62
74
  requirements:
63
75
  - - ! '>='
64
76
  - !ruby/object:Gem::Version
65
77
  version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: json
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 1.6.5
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70293149206540
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 1.6.5
69
94
  description: A utility that adds class based enum functionality to ActiveRecord attributes
70
95
  email: github@lette.us
71
96
  executables: []
@@ -85,19 +110,20 @@ files:
85
110
  - Rakefile
86
111
  - VERSION
87
112
  - classy_enum.gemspec
113
+ - gemfiles/Gemfile.rails-3.0.x
114
+ - gemfiles/Gemfile.rails-3.1.x
115
+ - gemfiles/Gemfile.rails-3.2.x
88
116
  - init.rb
89
117
  - lib/classy_enum.rb
90
118
  - lib/classy_enum/attributes.rb
91
119
  - lib/classy_enum/base.rb
92
120
  - lib/classy_enum/class_methods.rb
93
121
  - lib/classy_enum/instance_methods.rb
94
- - lib/classy_enum/semantic_form_builder.rb
95
122
  - lib/generators/classy_enum/classy_enum_generator.rb
96
123
  - lib/generators/classy_enum/templates/enum.rb
97
124
  - spec/active_record_spec.rb
98
125
  - spec/classy_enum_attributes_spec.rb
99
126
  - spec/classy_enum_owner_reference_spec.rb
100
- - spec/classy_enum_semantic_form_builder_spec.rb
101
127
  - spec/classy_enum_spec.rb
102
128
  - spec/spec_helper.rb
103
129
  homepage: http://github.com/beerlington/classy_enum
@@ -115,7 +141,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
141
  version: '0'
116
142
  segments:
117
143
  - 0
118
- hash: -3670451766157368452
144
+ hash: 3580145781228639088
119
145
  required_rubygems_version: !ruby/object:Gem::Requirement
120
146
  none: false
121
147
  requirements:
@@ -124,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
150
  version: '0'
125
151
  requirements: []
126
152
  rubyforge_project:
127
- rubygems_version: 1.8.15
153
+ rubygems_version: 1.8.19
128
154
  signing_key:
129
155
  specification_version: 3
130
156
  summary: A class based enumerator utility for Ruby on Rails
@@ -1,24 +0,0 @@
1
- module ClassyEnum
2
- class SemanticFormBuilder < Formtastic::SemanticFormBuilder # :nodoc: all
3
- def enum_select_input(method, options)
4
- raise Error.invalid_classy_enum_object(method) unless object.respond_to? "#{method}_options"
5
-
6
- enum_options = object.send("#{method}_options")
7
- enum_class = enum_options[:enum].to_s.classify.constantize
8
-
9
- options[:collection] = enum_class.select_options
10
- options[:selected] = object.send(method).to_s
11
- options[:include_blank] = enum_options[:allow_blank]
12
-
13
- select_input(method, options)
14
- end
15
- end
16
-
17
- module Error # :nodoc: all
18
- def self.invalid_classy_enum_object(method)
19
- raise "#{method} is not a ClassyEnum object. Make sure you've added 'classy_enum_attr :#{method}' to your model"
20
- end
21
- end
22
- end
23
-
24
- Formtastic::SemanticFormHelper.builder = ClassyEnum::SemanticFormBuilder
@@ -1,98 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- require 'classy_enum/semantic_form_builder'
3
-
4
- describe 'using enum_select input' do
5
- include FormtasticSpecHelper
6
-
7
- # Reset output buffer
8
- before { @output_buffer = "" }
9
-
10
- context 'when building a form with a classy_enum select' do
11
- context 'with an object that has the enum set' do
12
- let(:output) do
13
- semantic_form_for(Dog.new(:breed => :snoop), :url => "/") do |builder|
14
- concat(builder.input(:breed, :as => :enum_select))
15
- end
16
- end
17
-
18
- it 'should produce an unselected option tag for Golden Retriever' do
19
- output.should =~ Regexp.new(%q{option value="golden_retriever">Golden Retriever})
20
- end
21
-
22
- it 'should produce a selected option tag for Snoop' do
23
- output.should =~ Regexp.new(%q{<option value="snoop" selected="selected">Snoop})
24
- end
25
-
26
- it 'should not produce a blank option tag' do
27
- output.should_not =~ Regexp.new(%q{<option value=""><})
28
- end
29
- end
30
-
31
- context 'with an object that has a nil enum' do
32
- let(:output) do
33
- semantic_form_for(Dog.new, :url => "/") do |builder|
34
- concat(builder.input(:breed, :as => :enum_select))
35
- end
36
- end
37
-
38
- it 'should produce an unselected option tag for Golden Retriever' do
39
- output.should =~ Regexp.new(%q{<option value="golden_retriever">Golden Retriever})
40
- end
41
-
42
- it 'should not produce an selected option tag' do
43
- output.should_not =~ Regexp.new("selected")
44
- end
45
- end
46
-
47
- context 'with an object that allows blank enums' do
48
- let(:output) do
49
- semantic_form_for(AllowBlankBreedDog.new, :url => "/") do |builder|
50
- concat(builder.input(:breed, :as => :enum_select))
51
- end
52
- end
53
-
54
- it 'should produce an unselected option tag for Golden Retriever' do
55
- output.should =~ Regexp.new(%q{<option value="golden_retriever">Golden Retriever})
56
- end
57
-
58
- it 'should produce a blank option tag' do
59
- output.should =~ Regexp.new(%q{<option value=""><})
60
- end
61
- end
62
-
63
- context 'with an object that allows nil enums' do
64
- let(:output) do
65
- semantic_form_for(AllowNilBreedDog.new, :url => "/") do |builder|
66
- concat(builder.input(:breed, :as => :enum_select))
67
- end
68
- end
69
-
70
- it 'should produce an unselected option tag for Golden Retriever' do
71
- output.should =~ Regexp.new(%q{<option value="golden_retriever">Golden Retriever})
72
- end
73
-
74
- it 'should produce a blank option tag' do
75
- output.should_not =~ Regexp.new(%q{<option value=""><})
76
- end
77
- end
78
-
79
- end
80
-
81
- it 'should raise an error if the attribute is not a ClassyEnum object' do
82
- lambda do
83
- semantic_form_for(Dog.new(:breed => :snoop), :url => "/") do |builder|
84
- concat(builder.input(:id, :as => :enum_select))
85
- end
86
- end.should raise_error("id is not a ClassyEnum object. Make sure you've added 'classy_enum_attr :id' to your model")
87
- end
88
-
89
- it 'should raise an error if the attribute is not a ClassyEnum object and its value is nil' do
90
- lambda do
91
- semantic_form_for(Dog.new, :url => "/") do |builder|
92
- concat(builder.input(:id, :as => :enum_select))
93
- end
94
- end.should raise_error("id is not a ClassyEnum object. Make sure you've added 'classy_enum_attr :id' to your model")
95
- end
96
-
97
- end
98
-