classy_enum 0.5.0 → 0.6.0
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 +1 -0
- data/Gemfile.lock +8 -0
- data/README.textile +18 -30
- data/VERSION +1 -1
- data/classy_enum.gemspec +6 -6
- data/generators/classy_enum_generator.rb +1 -1
- data/generators/templates/enum.rb +7 -0
- data/lib/classy_enum.rb +48 -54
- data/lib/classy_enum/attributes.rb +7 -5
- data/lib/classy_enum/semantic_form_builder.rb +7 -7
- data/lib/generators/classy_enum/classy_enum_generator.rb +1 -1
- data/lib/generators/classy_enum/templates/enum.rb +7 -0
- data/spec/classy_enum_attributes_spec.rb +25 -3
- data/spec/classy_enum_semantic_form_builder_spec.rb +74 -0
- data/spec/classy_enum_spec.rb +31 -25
- data/spec/spec_helper.rb +2 -4
- metadata +15 -7
- data/generators/templates/enum.erb +0 -15
- data/lib/generators/classy_enum/templates/enum.erb +0 -15
- data/spec/classy_enum_semantic_form_builder.rb +0 -32
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -31,6 +31,7 @@ GEM
|
|
31
31
|
arel (1.0.1)
|
32
32
|
activesupport (~> 3.0.0)
|
33
33
|
builder (2.1.2)
|
34
|
+
columnize (0.3.2)
|
34
35
|
diff-lcs (1.1.2)
|
35
36
|
erubis (2.6.6)
|
36
37
|
abstract (>= 1.0.0)
|
@@ -39,6 +40,7 @@ GEM
|
|
39
40
|
activesupport (>= 2.3.0)
|
40
41
|
i18n (>= 0.4.0)
|
41
42
|
i18n (0.4.1)
|
43
|
+
linecache (0.43)
|
42
44
|
mail (2.2.7)
|
43
45
|
activesupport (>= 2.3.6)
|
44
46
|
mime-types
|
@@ -76,6 +78,11 @@ GEM
|
|
76
78
|
rspec-expectations (= 2.0.0)
|
77
79
|
rspec-rails (2.0.1)
|
78
80
|
rspec (~> 2.0.0)
|
81
|
+
ruby-debug (0.10.4)
|
82
|
+
columnize (>= 0.1)
|
83
|
+
ruby-debug-base (~> 0.10.4.0)
|
84
|
+
ruby-debug-base (0.10.4)
|
85
|
+
linecache (>= 0.3)
|
79
86
|
sqlite3-ruby (1.3.1)
|
80
87
|
thor (0.14.3)
|
81
88
|
treetop (1.4.8)
|
@@ -90,4 +97,5 @@ DEPENDENCIES
|
|
90
97
|
rails (~> 3.0)
|
91
98
|
rspec (~> 2.0)
|
92
99
|
rspec-rails (~> 2.0)
|
100
|
+
ruby-debug
|
93
101
|
sqlite3-ruby
|
data/README.textile
CHANGED
@@ -10,13 +10,7 @@ h2. Requirements
|
|
10
10
|
|
11
11
|
h2. Installation
|
12
12
|
|
13
|
-
The gem is hosted at "rubygems.org":https://rubygems.org/gems/classy_enum
|
14
|
-
|
15
|
-
It can be installed with:
|
16
|
-
|
17
|
-
<pre>
|
18
|
-
gem install classy_enum
|
19
|
-
</pre>
|
13
|
+
The gem is hosted at "rubygems.org":https://rubygems.org/gems/classy_enum and can be installed with: @gem install classy_enum@
|
20
14
|
|
21
15
|
h2. Example Usage
|
22
16
|
|
@@ -24,23 +18,23 @@ The most common use for ClassyEnum is to replace database lookup tables where th
|
|
24
18
|
|
25
19
|
The fastest way to get up and running with ClassyEnum is to use the built-in Rails generator like so:
|
26
20
|
|
21
|
+
Rails 2.3.x:
|
22
|
+
|
27
23
|
<pre>
|
28
24
|
script/generate classy_enum AlarmPriority low medium high
|
29
25
|
</pre>
|
30
26
|
|
31
|
-
|
27
|
+
Rails 3.x
|
32
28
|
|
33
29
|
<pre>
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
module InstanceMethods
|
38
|
-
end
|
30
|
+
rails g classy_enum AlarmPriority low medium high
|
31
|
+
</pre>
|
39
32
|
|
40
|
-
|
41
|
-
end
|
33
|
+
A new file will be created at app/enums/alarm_priority.rb that will look like:
|
42
34
|
|
43
|
-
|
35
|
+
<pre>
|
36
|
+
class AlarmPriority < ClassyEnum::Base
|
37
|
+
enum_classes :low, :medium, :high
|
44
38
|
end
|
45
39
|
|
46
40
|
class AlarmPriorityLow
|
@@ -55,21 +49,15 @@ end
|
|
55
49
|
|
56
50
|
That is the default setup, but can be changed to fit your needs, like so...
|
57
51
|
|
58
|
-
Using the
|
59
|
-
|
60
|
-
*It is important that you include ClassyEnum AFTER declaring your OPTIONS and Default methods because they are used when creating the enum classes*
|
52
|
+
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. In my example, each enum class has a method called @email?@. By default this method returns false, but is overridden for high priority alarms and returns true.
|
61
53
|
|
62
54
|
<pre>
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
false
|
69
|
-
end
|
55
|
+
class AlarmPriority < ClassyEnum::Base
|
56
|
+
enum_classes :low, :medium, :high
|
57
|
+
|
58
|
+
def email?
|
59
|
+
false
|
70
60
|
end
|
71
|
-
|
72
|
-
include ClassyEnum
|
73
61
|
end
|
74
62
|
|
75
63
|
class AlarmPriorityHigh
|
@@ -79,9 +67,9 @@ class AlarmPriorityHigh
|
|
79
67
|
end
|
80
68
|
</pre>
|
81
69
|
|
82
|
-
Then in my ActiveRecord model, Alarm, I've added a line that calls @classy_enum_attr@. The first argument is required, and is the name of the
|
70
|
+
Then in my ActiveRecord model, Alarm, I've added a line that calls @classy_enum_attr@. The first argument is required, and is the name of the class defined above. The second argument is optional and specifies which Alarm attribute will be used as an enumerable.
|
83
71
|
|
84
|
-
In this case, I am using the
|
72
|
+
In this case, I am using the class AlarmPriority, but the name of my attribute is priority. By default, it will use the name of class as the attribute name. If I wanted to do @alarm.alarm_priority@, I would not have included the second argument.
|
85
73
|
|
86
74
|
<pre>
|
87
75
|
class Alarm < ActiveRecord::Base
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
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.
|
8
|
+
s.version = "0.6.0"
|
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{2010-11-
|
12
|
+
s.date = %q{2010-11-13}
|
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 = [
|
@@ -27,15 +27,15 @@ Gem::Specification.new do |s|
|
|
27
27
|
"VERSION",
|
28
28
|
"classy_enum.gemspec",
|
29
29
|
"generators/classy_enum_generator.rb",
|
30
|
-
"generators/templates/enum.
|
30
|
+
"generators/templates/enum.rb",
|
31
31
|
"init.rb",
|
32
32
|
"lib/classy_enum.rb",
|
33
33
|
"lib/classy_enum/attributes.rb",
|
34
34
|
"lib/classy_enum/semantic_form_builder.rb",
|
35
35
|
"lib/generators/classy_enum/classy_enum_generator.rb",
|
36
|
-
"lib/generators/classy_enum/templates/enum.
|
36
|
+
"lib/generators/classy_enum/templates/enum.rb",
|
37
37
|
"spec/classy_enum_attributes_spec.rb",
|
38
|
-
"spec/
|
38
|
+
"spec/classy_enum_semantic_form_builder_spec.rb",
|
39
39
|
"spec/classy_enum_spec.rb",
|
40
40
|
"spec/spec_helper.rb"
|
41
41
|
]
|
@@ -46,7 +46,7 @@ Gem::Specification.new do |s|
|
|
46
46
|
s.summary = %q{A class based enumerator utility for Ruby on Rails}
|
47
47
|
s.test_files = [
|
48
48
|
"spec/classy_enum_attributes_spec.rb",
|
49
|
-
"spec/
|
49
|
+
"spec/classy_enum_semantic_form_builder_spec.rb",
|
50
50
|
"spec/classy_enum_spec.rb",
|
51
51
|
"spec/spec_helper.rb"
|
52
52
|
]
|
data/lib/classy_enum.rb
CHANGED
@@ -6,74 +6,68 @@ if Gem.available? 'formtastic'
|
|
6
6
|
end
|
7
7
|
|
8
8
|
module ClassyEnum
|
9
|
-
|
10
|
-
|
9
|
+
|
10
|
+
class Base
|
11
|
+
def self.enum_classes(*options)
|
12
|
+
self.send(:attr_reader, :enum_classes)
|
13
|
+
|
14
|
+
self.const_set("OPTIONS", options) unless self.const_defined? "OPTIONS"
|
15
|
+
|
16
|
+
self.extend ClassMethods
|
17
|
+
|
18
|
+
options.each_with_index do |option, index|
|
19
|
+
|
20
|
+
klass = Class.new(self) do
|
21
|
+
attr_reader :to_s, :to_sym, :index
|
22
|
+
|
23
|
+
@index = index + 1
|
24
|
+
@option = option
|
25
|
+
|
26
|
+
def initialize
|
27
|
+
@to_s = self.class.instance_variable_get('@option').to_s
|
28
|
+
@to_sym = @to_s.to_sym
|
29
|
+
@index = self.class.instance_variable_get('@index')
|
30
|
+
end
|
31
|
+
|
32
|
+
def name
|
33
|
+
@to_s.titleize
|
34
|
+
end
|
35
|
+
|
36
|
+
def <=> other
|
37
|
+
@index <=> other.index
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
klass_name = "#{self}#{option.to_s.camelize}"
|
42
|
+
Object.const_set(klass_name, klass) unless Object.const_defined? klass_name
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module ClassMethods
|
11
48
|
|
12
|
-
def
|
49
|
+
def build(option)
|
13
50
|
return nil if option.nil?
|
14
|
-
|
51
|
+
return TypeError.new("Valid #{self} options are #{self.valid_options}") unless self::OPTIONS.include? option.to_sym
|
52
|
+
Object.const_get("#{self}#{option.to_s.camelize}").new
|
15
53
|
end
|
16
54
|
|
55
|
+
# Alias of build
|
56
|
+
def find(option); build(option); end;
|
57
|
+
|
17
58
|
def all
|
18
|
-
self::OPTIONS.map {|e|
|
59
|
+
self::OPTIONS.map {|e| build(e) }
|
19
60
|
end
|
20
61
|
|
21
62
|
# Uses the name field for select options
|
22
|
-
def
|
23
|
-
|
63
|
+
def select_options
|
64
|
+
all.map {|e| [e.name, e.to_s] }
|
24
65
|
end
|
25
66
|
|
26
67
|
def valid_options
|
27
68
|
self::OPTIONS.map(&:to_s).join(', ')
|
28
69
|
end
|
29
|
-
|
30
|
-
# Alias of new
|
31
|
-
def find(option)
|
32
|
-
new(option)
|
33
|
-
end
|
34
70
|
|
35
71
|
end
|
36
|
-
|
37
|
-
def self.included(other)
|
38
|
-
other.extend SuperClassMethods
|
39
|
-
|
40
|
-
other.const_set("OPTION_HASH", Hash.new) unless other.const_defined? "OPTION_HASH"
|
41
|
-
|
42
|
-
other::OPTIONS.each do |option|
|
43
|
-
|
44
|
-
klass = Class.new do
|
45
|
-
self.send(:attr_reader, :to_s, :to_sym, :index, :base_class)
|
46
|
-
|
47
|
-
def initialize(base_class, option, index)
|
48
|
-
@to_s = option.to_s.downcase
|
49
|
-
@to_sym = @to_s.to_sym
|
50
|
-
@index = index + 1
|
51
|
-
@base_class = base_class
|
52
|
-
end
|
53
|
-
|
54
|
-
def name
|
55
|
-
to_s.titleize
|
56
|
-
end
|
57
|
-
|
58
|
-
def <=> other
|
59
|
-
@index <=> other.index
|
60
|
-
end
|
61
|
-
|
62
|
-
include other::InstanceMethods if other.const_defined?("InstanceMethods")
|
63
|
-
extend other::ClassMethods if other.const_defined?("ClassMethods")
|
64
|
-
end
|
65
|
-
|
66
|
-
Object.const_set("#{other}#{option.to_s.camelize}", klass)
|
67
|
-
|
68
|
-
instance = klass.new(other, option, other::OPTIONS.index(option))
|
69
|
-
|
70
|
-
other::OPTION_HASH[option] = instance
|
71
|
-
|
72
|
-
ClassyEnum.const_set(option.to_s.upcase, instance) unless ClassyEnum.const_defined?(option.to_s.upcase)
|
73
|
-
end
|
74
72
|
|
75
|
-
end
|
76
|
-
|
77
73
|
end
|
78
|
-
|
79
|
-
|
@@ -7,14 +7,16 @@ module ClassyEnum
|
|
7
7
|
|
8
8
|
klass = klass.to_s.camelize.constantize
|
9
9
|
|
10
|
-
# Add ActiveRecord validation to ensure it won't be saved unless it's an option
|
11
|
-
self.send(:validates_inclusion_of, method, :in => klass.all, :allow_nil => true)
|
12
|
-
|
13
10
|
self.instance_eval do
|
14
11
|
|
12
|
+
# Add ActiveRecord validation to ensure it won't be saved unless it's an option
|
13
|
+
validates_each [method], :allow_nil => true do |record, attr_name, value|
|
14
|
+
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
|
15
|
+
end
|
16
|
+
|
15
17
|
# Define getter method
|
16
18
|
define_method method do
|
17
|
-
klass.
|
19
|
+
klass.build(super())
|
18
20
|
end
|
19
21
|
|
20
22
|
# Define setter method
|
@@ -29,4 +31,4 @@ module ClassyEnum
|
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
|
-
ActiveRecord::Base.send :extend, ClassyEnum::Attributes
|
34
|
+
ActiveRecord::Base.send :extend, ClassyEnum::Attributes
|
@@ -2,13 +2,13 @@ module ClassyEnum
|
|
2
2
|
class SemanticFormBuilder < Formtastic::SemanticFormBuilder
|
3
3
|
def enum_select_input(method, options)
|
4
4
|
enum_class = object.send(method)
|
5
|
-
|
5
|
+
|
6
6
|
if enum_class.nil?
|
7
|
-
enum_class = method.to_s.capitalize.constantize rescue
|
8
|
-
options[:collection] = enum_class.
|
7
|
+
enum_class = method.to_s.capitalize.constantize rescue Error.invalid_classy_enum_object(method)
|
8
|
+
options[:collection] = enum_class.select_options
|
9
9
|
else
|
10
|
-
|
11
|
-
options[:collection] = enum_class.
|
10
|
+
Error.invalid_classy_enum_object unless enum_class.respond_to? :enum_classes
|
11
|
+
options[:collection] = enum_class.class.superclass.select_options
|
12
12
|
options[:selected] = enum_class.to_s
|
13
13
|
end
|
14
14
|
|
@@ -19,8 +19,8 @@ module ClassyEnum
|
|
19
19
|
end
|
20
20
|
|
21
21
|
module Error
|
22
|
-
def invalid_classy_enum_object
|
23
|
-
raise "#{method}
|
22
|
+
def self.invalid_classy_enum_object(method)
|
23
|
+
raise "#{method} is not a ClassyEnum object"
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -21,8 +21,30 @@ describe "A Dog" do
|
|
21
21
|
@dog.breed.class.should == BreedGoldenRetriever
|
22
22
|
end
|
23
23
|
|
24
|
-
it "should
|
25
|
-
@dog.breed.
|
24
|
+
it "should respond to enum_classes" do
|
25
|
+
@dog.breed.should respond_to('enum_classes')
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be valid with a valid option" do
|
29
|
+
@dog.should be_valid
|
30
|
+
end
|
31
|
+
|
32
|
+
context "with an invalid breed option" do
|
33
|
+
before { @dog.breed = :golden_doodle }
|
34
|
+
|
35
|
+
it "should not be valid with an invalid option" do
|
36
|
+
@dog.should_not be_valid
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should have an error for the breed" do
|
40
|
+
@dog.valid?
|
41
|
+
@dog.errors.should include(:breed)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should have an error message containing the right options" do
|
45
|
+
@dog.valid?
|
46
|
+
@dog.errors[:breed].should include("must be one of #{Breed.all.map(&:to_sym).join(', ')}")
|
47
|
+
end
|
26
48
|
end
|
27
49
|
|
28
50
|
end
|
@@ -39,6 +61,6 @@ describe "A Thing" do
|
|
39
61
|
end
|
40
62
|
|
41
63
|
it "should have a base class of Breed" do
|
42
|
-
@thing.dog_breed.
|
64
|
+
@thing.dog_breed.should respond_to('enum_classes')
|
43
65
|
end
|
44
66
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "spec/spec_helper"
|
2
|
+
|
3
|
+
describe 'using enum_select input' do
|
4
|
+
include FormtasticSpecHelper
|
5
|
+
|
6
|
+
Formtastic::SemanticFormHelper.builder = ClassyEnum::SemanticFormBuilder
|
7
|
+
|
8
|
+
# Copied from how formtastic tests its form helpers
|
9
|
+
before do
|
10
|
+
@output_buffer = ""
|
11
|
+
end
|
12
|
+
|
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))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should produce a form tag" do
|
21
|
+
@output.should =~ /<form/
|
22
|
+
end
|
23
|
+
|
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
|
28
|
+
|
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
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
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(:breed, :as => :enum_select))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should produce a form tag" do
|
43
|
+
@output.should =~ /<form/
|
44
|
+
end
|
45
|
+
|
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
|
50
|
+
|
51
|
+
it "should produce an unselected option tag for Snoop" do
|
52
|
+
regex = Regexp.new("<option value=\\\"snoop\\\">Snoop")
|
53
|
+
@output.should =~ regex
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should raise an error if the attribute is not a ClassyEnum object" do
|
58
|
+
lambda do
|
59
|
+
@output = semantic_form_for(Dog.new(:breed => :snoop), :url => "/") do |builder|
|
60
|
+
concat(builder.input(:id, :as => :enum_select))
|
61
|
+
end
|
62
|
+
end.should raise_error("id is not a ClassyEnum object")
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should raise an error if the attribute is not a ClassyEnum object and its value is nil" do
|
66
|
+
lambda do
|
67
|
+
@output = semantic_form_for(Dog.new, :url => "/") do |builder|
|
68
|
+
concat(builder.input(:id, :as => :enum_select))
|
69
|
+
end
|
70
|
+
end.should raise_error("id is not a ClassyEnum object")
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
data/spec/classy_enum_spec.rb
CHANGED
@@ -1,21 +1,15 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
class TestEnum < ClassyEnum::Base
|
4
|
+
enum_classes :one, :two, :three
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
false
|
9
|
-
end
|
6
|
+
def self.test_class_method?
|
7
|
+
false
|
10
8
|
end
|
11
9
|
|
12
|
-
|
13
|
-
|
14
|
-
false
|
15
|
-
end
|
10
|
+
def test_instance_method?
|
11
|
+
false
|
16
12
|
end
|
17
|
-
|
18
|
-
include ClassyEnum
|
19
13
|
end
|
20
14
|
|
21
15
|
class TestEnumTwo
|
@@ -28,7 +22,7 @@ class TestEnumTwo
|
|
28
22
|
end
|
29
23
|
end
|
30
24
|
|
31
|
-
describe
|
25
|
+
describe TestEnum do
|
32
26
|
|
33
27
|
TestEnum::OPTIONS.each do |option|
|
34
28
|
it "should define a TestEnum#{option.to_s.capitalize} class" do
|
@@ -37,22 +31,22 @@ describe ClassyEnum do
|
|
37
31
|
end
|
38
32
|
|
39
33
|
it "should return an array of enums" do
|
40
|
-
TestEnum.all.should ==
|
34
|
+
TestEnum.all.map(&:class).should == [TestEnumOne, TestEnumTwo, TestEnumThree]
|
41
35
|
end
|
42
36
|
|
43
37
|
it "should return an array of enums for a select tag" do
|
44
|
-
TestEnum.
|
38
|
+
TestEnum.select_options.should == TestEnum::OPTIONS.map {|o| [TestEnum.build(o).name, TestEnum.build(o).to_s] }
|
45
39
|
end
|
46
40
|
|
47
41
|
it "should return a type error when adding an invalid option" do
|
48
|
-
TestEnum.
|
42
|
+
TestEnum.build(:invalid_option).class.should == TypeError
|
49
43
|
end
|
50
44
|
|
51
45
|
context "with a collection of enums" do
|
52
46
|
before(:each) do
|
53
|
-
@one = TestEnum.
|
54
|
-
@two = TestEnum.
|
55
|
-
@three = TestEnum.
|
47
|
+
@one = TestEnum.build(:one)
|
48
|
+
@two = TestEnum.build(:two)
|
49
|
+
@three = TestEnum.build(:three)
|
56
50
|
|
57
51
|
@unordered = [@one, @three, @two]
|
58
52
|
end
|
@@ -73,12 +67,24 @@ describe ClassyEnum do
|
|
73
67
|
it "should find an enum by string" do
|
74
68
|
TestEnum.find("one").class.should == TestEnumOne
|
75
69
|
end
|
76
|
-
|
70
|
+
|
77
71
|
end
|
78
72
|
|
79
|
-
describe "
|
80
|
-
before
|
73
|
+
describe "A ClassyEnum instance" do
|
74
|
+
before { @enum = TestEnum.build(:one) }
|
81
75
|
|
76
|
+
it "should build a TestEnum class" do
|
77
|
+
@enum.class.should == TestEnumOne
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should instantiate a member" do
|
81
|
+
TestEnumOne.new.should be_a(TestEnumOne)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should be a TestEnum" do
|
85
|
+
@enum.should be_a(TestEnum)
|
86
|
+
end
|
87
|
+
|
82
88
|
it "should convert to a string" do
|
83
89
|
@enum.to_s.should == "one"
|
84
90
|
end
|
@@ -100,14 +106,14 @@ describe "An ClassyEnumValue" do
|
|
100
106
|
end
|
101
107
|
|
102
108
|
it "should create the same instance with a string or symbol" do
|
103
|
-
@enum_string = TestEnum.
|
109
|
+
@enum_string = TestEnum.build("one")
|
104
110
|
|
105
|
-
@enum.should == @enum_string
|
111
|
+
@enum.class.should == @enum_string.class
|
106
112
|
end
|
107
113
|
end
|
108
114
|
|
109
115
|
describe "An ClassyEnumValue" do
|
110
|
-
before(:each) { @enum = TestEnum.
|
116
|
+
before(:each) { @enum = TestEnum.build(:two) }
|
111
117
|
|
112
118
|
it "should override the default instance methods" do
|
113
119
|
@enum.test_instance_method?.should be_true
|
data/spec/spec_helper.rb
CHANGED
@@ -22,10 +22,8 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
include ClassyEnum
|
25
|
+
class Breed < ClassyEnum::Base
|
26
|
+
enum_classes :golden_retriever, :snoop
|
29
27
|
end
|
30
28
|
|
31
29
|
class Dog < ActiveRecord::Base
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: classy_enum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 7
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
|
-
-
|
8
|
+
- 6
|
8
9
|
- 0
|
9
|
-
version: 0.
|
10
|
+
version: 0.6.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Peter Brown
|
@@ -14,7 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2010-11-
|
18
|
+
date: 2010-11-13 00:00:00 -05:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
@@ -25,6 +26,7 @@ dependencies:
|
|
25
26
|
requirements:
|
26
27
|
- - ~>
|
27
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
28
30
|
segments:
|
29
31
|
- 2
|
30
32
|
- 0
|
@@ -39,6 +41,7 @@ dependencies:
|
|
39
41
|
requirements:
|
40
42
|
- - ~>
|
41
43
|
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
42
45
|
segments:
|
43
46
|
- 2
|
44
47
|
- 0
|
@@ -53,6 +56,7 @@ dependencies:
|
|
53
56
|
requirements:
|
54
57
|
- - ~>
|
55
58
|
- !ruby/object:Gem::Version
|
59
|
+
hash: 13
|
56
60
|
segments:
|
57
61
|
- 1
|
58
62
|
- 1
|
@@ -67,6 +71,7 @@ dependencies:
|
|
67
71
|
requirements:
|
68
72
|
- - ">="
|
69
73
|
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
70
75
|
segments:
|
71
76
|
- 0
|
72
77
|
version: "0"
|
@@ -80,6 +85,7 @@ dependencies:
|
|
80
85
|
requirements:
|
81
86
|
- - ">="
|
82
87
|
- !ruby/object:Gem::Version
|
88
|
+
hash: 5
|
83
89
|
segments:
|
84
90
|
- 2
|
85
91
|
- 3
|
@@ -106,15 +112,15 @@ files:
|
|
106
112
|
- VERSION
|
107
113
|
- classy_enum.gemspec
|
108
114
|
- generators/classy_enum_generator.rb
|
109
|
-
- generators/templates/enum.
|
115
|
+
- generators/templates/enum.rb
|
110
116
|
- init.rb
|
111
117
|
- lib/classy_enum.rb
|
112
118
|
- lib/classy_enum/attributes.rb
|
113
119
|
- lib/classy_enum/semantic_form_builder.rb
|
114
120
|
- lib/generators/classy_enum/classy_enum_generator.rb
|
115
|
-
- lib/generators/classy_enum/templates/enum.
|
121
|
+
- lib/generators/classy_enum/templates/enum.rb
|
116
122
|
- spec/classy_enum_attributes_spec.rb
|
117
|
-
- spec/
|
123
|
+
- spec/classy_enum_semantic_form_builder_spec.rb
|
118
124
|
- spec/classy_enum_spec.rb
|
119
125
|
- spec/spec_helper.rb
|
120
126
|
has_rdoc: true
|
@@ -131,6 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
131
137
|
requirements:
|
132
138
|
- - ">="
|
133
139
|
- !ruby/object:Gem::Version
|
140
|
+
hash: 3
|
134
141
|
segments:
|
135
142
|
- 0
|
136
143
|
version: "0"
|
@@ -139,6 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
146
|
requirements:
|
140
147
|
- - ">="
|
141
148
|
- !ruby/object:Gem::Version
|
149
|
+
hash: 3
|
142
150
|
segments:
|
143
151
|
- 0
|
144
152
|
version: "0"
|
@@ -151,6 +159,6 @@ specification_version: 3
|
|
151
159
|
summary: A class based enumerator utility for Ruby on Rails
|
152
160
|
test_files:
|
153
161
|
- spec/classy_enum_attributes_spec.rb
|
154
|
-
- spec/
|
162
|
+
- spec/classy_enum_semantic_form_builder_spec.rb
|
155
163
|
- spec/classy_enum_spec.rb
|
156
164
|
- spec/spec_helper.rb
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module <%= class_name %>
|
2
|
-
OPTIONS = [<%= args.map {|a| ":#{a}"}.join(", ") %>]
|
3
|
-
|
4
|
-
module InstanceMethods
|
5
|
-
end
|
6
|
-
|
7
|
-
module ClassMethods
|
8
|
-
end
|
9
|
-
|
10
|
-
include ClassyEnum
|
11
|
-
end
|
12
|
-
<% args.each do |arg| %>
|
13
|
-
class <%= class_name + arg.camelize %>
|
14
|
-
end
|
15
|
-
<% end %>
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module <%= class_name %>
|
2
|
-
OPTIONS = [<%= values.map {|a| ":#{a}"}.join(", ") %>]
|
3
|
-
|
4
|
-
module InstanceMethods
|
5
|
-
end
|
6
|
-
|
7
|
-
module ClassMethods
|
8
|
-
end
|
9
|
-
|
10
|
-
include ClassyEnum
|
11
|
-
end
|
12
|
-
<% values.each do |arg| %>
|
13
|
-
class <%= class_name + arg.camelize %>
|
14
|
-
end
|
15
|
-
<% end %>
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require "spec/spec_helper"
|
2
|
-
|
3
|
-
describe 'using enum_select input' do
|
4
|
-
include FormtasticSpecHelper
|
5
|
-
|
6
|
-
Formtastic::SemanticFormHelper.builder = ClassyEnum::SemanticFormBuilder
|
7
|
-
|
8
|
-
context "when building a form with a classy_enum select" do
|
9
|
-
before(:each) do
|
10
|
-
@output_buffer = ""
|
11
|
-
@output = semantic_form_for(Dog.new(:breed => :snoop), :url => "/") do |builder|
|
12
|
-
concat(builder.input(:breed, :as => :enum_select))
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should produce a form tag" do
|
17
|
-
@output.should =~ /<form/
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should produce an unselected option tag for Golden Retriever" do
|
21
|
-
regex = Regexp.new("<option value=\\\"golden_retriever\\\">Golden Retriever")
|
22
|
-
@output.should =~ regex
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should produce an selected option tag for Snoop" do
|
26
|
-
regex = Regexp.new("<option value=\\\"snoop\\\" selected=\\\"selected\\\">Snoop")
|
27
|
-
@output.should =~ regex
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|