edave-enumerated_attribute 0.2.18
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +15 -0
- data/CHANGELOG.rdoc +49 -0
- data/LICENSE +20 -0
- data/README.rdoc +558 -0
- data/Rakefile +30 -0
- data/init.rb +1 -0
- data/lib/enumerated_attribute.rb +24 -0
- data/lib/enumerated_attribute/attribute.rb +79 -0
- data/lib/enumerated_attribute/attribute/arguments.rb +48 -0
- data/lib/enumerated_attribute/attribute/attribute_descriptor.rb +51 -0
- data/lib/enumerated_attribute/attribute/class_methods.rb +45 -0
- data/lib/enumerated_attribute/attribute/instance_methods.rb +96 -0
- data/lib/enumerated_attribute/integrations.rb +33 -0
- data/lib/enumerated_attribute/integrations/active_record.rb +114 -0
- data/lib/enumerated_attribute/integrations/datamapper.rb +6 -0
- data/lib/enumerated_attribute/integrations/default.rb +25 -0
- data/lib/enumerated_attribute/integrations/object.rb +47 -0
- data/lib/enumerated_attribute/method_definition_dsl.rb +142 -0
- data/lib/enumerated_attribute/rails_helpers.rb +99 -0
- data/spec/active_record/active_record_spec.rb +384 -0
- data/spec/active_record/association_test_classes.rb +40 -0
- data/spec/active_record/associations_spec.rb +130 -0
- data/spec/active_record/cfg.rb +6 -0
- data/spec/active_record/df.rb +12 -0
- data/spec/active_record/inheritance_classes.rb +19 -0
- data/spec/active_record/inheritance_spec.rb +60 -0
- data/spec/active_record/race_car.rb +15 -0
- data/spec/active_record/single_table_inheritance_spec.rb +0 -0
- data/spec/active_record/sti_classes.rb +10 -0
- data/spec/active_record/sti_spec.rb +41 -0
- data/spec/active_record/test_in_memory.rb +71 -0
- data/spec/car.rb +67 -0
- data/spec/cfg.rb +8 -0
- data/spec/inheritance_classes.rb +16 -0
- data/spec/inheritance_spec.rb +80 -0
- data/spec/new_and_method_missing_spec.rb +73 -0
- data/spec/plural.rb +8 -0
- data/spec/poro_spec.rb +420 -0
- data/spec/rails/README +243 -0
- data/spec/rails/Rakefile +10 -0
- data/spec/rails/app/controllers/application_controller.rb +10 -0
- data/spec/rails/app/controllers/form_test_controller.rb +38 -0
- data/spec/rails/app/helpers/application_helper.rb +3 -0
- data/spec/rails/app/helpers/form_test_helper.rb +2 -0
- data/spec/rails/app/models/user.rb +9 -0
- data/spec/rails/app/views/form_test/form.html.erb +1 -0
- data/spec/rails/app/views/form_test/form_for.html.erb +10 -0
- data/spec/rails/app/views/form_test/form_tag.html.erb +9 -0
- data/spec/rails/app/views/form_test/index.html.erb +6 -0
- data/spec/rails/app/views/layouts/application.html.erb +11 -0
- data/spec/rails/config/boot.rb +110 -0
- data/spec/rails/config/database.yml +22 -0
- data/spec/rails/config/environment.rb +45 -0
- data/spec/rails/config/environments/development.rb +17 -0
- data/spec/rails/config/environments/production.rb +28 -0
- data/spec/rails/config/environments/test.rb +28 -0
- data/spec/rails/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails/config/initializers/inflections.rb +10 -0
- data/spec/rails/config/initializers/mime_types.rb +5 -0
- data/spec/rails/config/initializers/new_rails_defaults.rb +19 -0
- data/spec/rails/config/initializers/session_store.rb +15 -0
- data/spec/rails/config/locales/en.yml +5 -0
- data/spec/rails/config/routes.rb +43 -0
- data/spec/rails/db/development.sqlite3 +0 -0
- data/spec/rails/db/migrate/20090804230221_create_sessions.rb +16 -0
- data/spec/rails/db/migrate/20090804230546_create_users.rb +21 -0
- data/spec/rails/db/schema.rb +35 -0
- data/spec/rails/db/test.sqlite3 +0 -0
- data/spec/rails/public/404.html +30 -0
- data/spec/rails/public/422.html +30 -0
- data/spec/rails/public/500.html +30 -0
- data/spec/rails/public/favicon.ico +0 -0
- data/spec/rails/public/images/rails.png +0 -0
- data/spec/rails/public/index.html +275 -0
- data/spec/rails/public/javascripts/application.js +2 -0
- data/spec/rails/public/javascripts/controls.js +963 -0
- data/spec/rails/public/javascripts/dragdrop.js +973 -0
- data/spec/rails/public/javascripts/effects.js +1128 -0
- data/spec/rails/public/javascripts/prototype.js +4320 -0
- data/spec/rails/public/robots.txt +5 -0
- data/spec/rails/public/stylesheets/scaffold.css +54 -0
- data/spec/rails/script/about +4 -0
- data/spec/rails/script/autospec +6 -0
- data/spec/rails/script/console +3 -0
- data/spec/rails/script/dbconsole +3 -0
- data/spec/rails/script/destroy +3 -0
- data/spec/rails/script/generate +3 -0
- data/spec/rails/script/performance/benchmarker +3 -0
- data/spec/rails/script/performance/profiler +3 -0
- data/spec/rails/script/plugin +3 -0
- data/spec/rails/script/runner +3 -0
- data/spec/rails/script/server +3 -0
- data/spec/rails/script/spec +10 -0
- data/spec/rails/script/spec_server +9 -0
- data/spec/rails/spec/controllers/form_test_controller_spec.rb +41 -0
- data/spec/rails/spec/integrations/enum_select_spec.rb +75 -0
- data/spec/rails/spec/matchers.rb +12 -0
- data/spec/rails/spec/rcov.opts +2 -0
- data/spec/rails/spec/spec.opts +4 -0
- data/spec/rails/spec/spec_helper.rb +40 -0
- data/spec/rails/spec/views/form_test/form.html.erb_spec.rb +12 -0
- data/spec/rails/spec/views/form_test/form_for.html.erb_spec.rb +12 -0
- data/spec/rails/spec/views/form_test/form_tag.html.erb_spec.rb +12 -0
- data/spec/rcov.opts +2 -0
- data/spec/spec.opts +4 -0
- data/spec/tractor.rb +48 -0
- metadata +190 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
module EnumeratedAttribute
|
2
|
+
module Integrations
|
3
|
+
|
4
|
+
module Default
|
5
|
+
def self.included(klass); klass.extend(ClassMethods); end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def define_enumerated_attribute_writer_method(name)
|
9
|
+
method_name = "#{name}=".to_sym
|
10
|
+
class_eval do
|
11
|
+
define_method(method_name) {|val| write_enumerated_attribute(name.to_sym, val) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def define_enumerated_attribute_reader_method(name)
|
16
|
+
name = name.to_sym
|
17
|
+
class_eval do
|
18
|
+
define_method(name) { read_enumerated_attribute(name) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module EnumeratedAttribute
|
2
|
+
module Integrations
|
3
|
+
|
4
|
+
module Object
|
5
|
+
def self.included(klass)
|
6
|
+
klass.extend(ClassMethods)
|
7
|
+
end
|
8
|
+
|
9
|
+
def write_enumerated_attribute(name, val)
|
10
|
+
name = name.to_s
|
11
|
+
val = nil if val == ''
|
12
|
+
val = val.to_sym if val
|
13
|
+
unless self.class.enumerated_attribute_allows_value?(name, val)
|
14
|
+
raise(InvalidEnumeration, "nil is not allowed on '#{name}' attribute, set :nil=>true option", caller) unless val
|
15
|
+
raise(InvalidEnumeration, ":#{val} is not a defined enumeration value for the '#{name}' attribute", caller)
|
16
|
+
end
|
17
|
+
instance_variable_set('@'+name, val)
|
18
|
+
end
|
19
|
+
|
20
|
+
def read_enumerated_attribute(name)
|
21
|
+
instance_variable_get('@'+name.to_s)
|
22
|
+
end
|
23
|
+
|
24
|
+
module ClassMethods
|
25
|
+
private
|
26
|
+
|
27
|
+
def define_enumerated_attribute_new_method
|
28
|
+
class_eval do
|
29
|
+
class << self
|
30
|
+
unless method_defined?(:new_without_enumerated_attribute)
|
31
|
+
alias_method :new_without_enumerated_attribute, :new
|
32
|
+
def new(*args, &block)
|
33
|
+
result = new_without_enumerated_attribute(*args)
|
34
|
+
result.initialize_enumerated_attributes
|
35
|
+
yield result if block_given?
|
36
|
+
result
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
module EnumeratedAttribute
|
2
|
+
|
3
|
+
class MethodDefinition
|
4
|
+
attr_accessor :method_name, :negated, :argument
|
5
|
+
|
6
|
+
def initialize(name, arg, negated=false)
|
7
|
+
@method_name, @negated, @argument = name, negated, arg
|
8
|
+
end
|
9
|
+
|
10
|
+
def is_predicate_method?; @method_name[-1, 1] == '?'; end
|
11
|
+
def has_method_name?; !!@method_name; end
|
12
|
+
def has_argument?; !!@argument; end
|
13
|
+
end
|
14
|
+
|
15
|
+
class MethodDefinitionDSL
|
16
|
+
attr_reader :initial_value, :pluralized_name, :decrementor_name, :incrementor_name
|
17
|
+
|
18
|
+
def initialize(class_obj, descriptor)
|
19
|
+
@class_obj = class_obj
|
20
|
+
@attr_name = descriptor.name
|
21
|
+
@attr_descriptor = descriptor #this is the enums array
|
22
|
+
end
|
23
|
+
|
24
|
+
#we'll by pass this - they can use it if it helps make code more readable - not enforced - should it be??
|
25
|
+
def define
|
26
|
+
end
|
27
|
+
|
28
|
+
def is_not(*args)
|
29
|
+
arg = args.first if args.length > 0
|
30
|
+
MethodDefinition.new(nil, arg, true)
|
31
|
+
end
|
32
|
+
alias :isnt :is_not
|
33
|
+
|
34
|
+
def is(*args)
|
35
|
+
arg = args.first if args.length > 0
|
36
|
+
MethodDefinition.new(nil, arg)
|
37
|
+
end
|
38
|
+
|
39
|
+
def method_missing(methId, *args, &block)
|
40
|
+
meth_name = methId.id2name
|
41
|
+
|
42
|
+
meth_def = nil
|
43
|
+
if args.size > 0
|
44
|
+
arg = args.first
|
45
|
+
if arg.instance_of?(EnumeratedAttribute::MethodDefinition)
|
46
|
+
if arg.has_method_name?
|
47
|
+
raise_method_syntax_error(meth_name, arg.method_name)
|
48
|
+
end
|
49
|
+
meth_def = arg
|
50
|
+
meth_def.method_name = meth_name
|
51
|
+
else
|
52
|
+
meth_def = MethodDefinition.new(meth_name, arg)
|
53
|
+
end
|
54
|
+
elsif block_given?
|
55
|
+
meth_def = MethodDefinition.new(meth_name, block)
|
56
|
+
else
|
57
|
+
raise_method_syntax_error(meth_name)
|
58
|
+
end
|
59
|
+
evaluate_method_definition(meth_def)
|
60
|
+
end
|
61
|
+
|
62
|
+
def init(value)
|
63
|
+
if (!@attr_descriptor.empty? && !@attr_descriptor.include?(value.to_sym))
|
64
|
+
raise(InvalidDefinition, "'#{value}' in method 'init' is not an enumeration value for :#{@attr_name} attribute", caller)
|
65
|
+
end
|
66
|
+
@initial_value = value
|
67
|
+
end
|
68
|
+
|
69
|
+
def decrementor(value); @decrementor_name = value; end
|
70
|
+
def incrementor(value); @incrementor_name = value; end
|
71
|
+
def enums_accessor(value); @pluralized_name = value; end
|
72
|
+
alias_method :inc, :incrementor
|
73
|
+
alias_method :dec, :decrementor
|
74
|
+
alias_method :enums, :enums_accessor
|
75
|
+
alias_method :plural, :enums_accessor
|
76
|
+
|
77
|
+
def label(hash)
|
78
|
+
raise(InvalidDefinition, "label or labels keyword should be followed by a hash of :enum_value=>'label'", caller) unless hash.is_a?(Hash)
|
79
|
+
hash.each do |k,v|
|
80
|
+
raise(InvalidDefinition, "#{k} is not an enumeration value for :#{@attr_name} attribute", caller) unless (k.is_a?(Symbol) && @attr_descriptor.include?(k))
|
81
|
+
raise(InvalidDefinition, "#{v} is not a string. Labels should be strings", caller) unless v.is_a?(String)
|
82
|
+
@attr_descriptor.set_label(k, v)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
alias_method :labels, :label
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def raise_method_syntax_error(meth_name, offending_token=nil)
|
90
|
+
suffix = offending_token ? "found '#{offending_token}'" : "found nothing"
|
91
|
+
followed_by = (meth_name[-1,1] == '?' ? "is_not, an enumeration value, an array of enumeration values, " : "") + "a proc, lambda or code block"
|
92
|
+
raise InvalidDefinition, "'#{meth_name}' should be followed by #{followed_by} -- but #{suffix}"
|
93
|
+
end
|
94
|
+
|
95
|
+
def evaluate_method_definition(mdef)
|
96
|
+
unless mdef.has_argument?
|
97
|
+
return raise_method_syntax_error(mdef.method_name)
|
98
|
+
end
|
99
|
+
|
100
|
+
if mdef.is_predicate_method?
|
101
|
+
case mdef.argument
|
102
|
+
when String
|
103
|
+
return create_custom_method_for_symbol_or_string(mdef)
|
104
|
+
when Symbol
|
105
|
+
return create_custom_method_for_symbol_or_string(mdef)
|
106
|
+
when Array
|
107
|
+
return create_custom_method_for_array_of_enums(mdef)
|
108
|
+
when Proc
|
109
|
+
return create_custom_method_for_proc(mdef)
|
110
|
+
end
|
111
|
+
else #action method
|
112
|
+
if mdef.argument.instance_of?(Proc)
|
113
|
+
return create_custom_method_for_proc(mdef)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
raise_method_syntax_error(mdef.method_name, mdef.argument)
|
117
|
+
end
|
118
|
+
|
119
|
+
def create_custom_method_for_proc(mdef)
|
120
|
+
@class_obj.send(:define_method, mdef.method_name, mdef.argument)
|
121
|
+
end
|
122
|
+
|
123
|
+
def create_custom_method_for_symbol_or_string(mdef)
|
124
|
+
if (!@attr_descriptor.empty? && !@attr_descriptor.include?(mdef.argument.to_sym))
|
125
|
+
raise(InvalidDefinition, "'#{mdef.argument}' in method '#{mdef.method_name}' is not an enumeration value for :#{@attr_name} attribute", caller)
|
126
|
+
end
|
127
|
+
@class_obj.class_eval("def #{mdef.method_name}; @#{@attr_name} #{mdef.negated ? '!=' : '=='} :#{mdef.argument}; end")
|
128
|
+
end
|
129
|
+
|
130
|
+
def create_custom_method_for_array_of_enums(mdef)
|
131
|
+
if !@attr_descriptor.empty?
|
132
|
+
mdef.argument.each do |m|
|
133
|
+
if !@attr_descriptor.include?(m.to_sym)
|
134
|
+
raise(InvalidDefinition, "'#{m}' in method '#{mdef.method_name}' is not an enumeration value for :#{@attr_name} attribute", caller)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
@class_obj.class_eval("def #{mdef.method_name}; #{mdef.negated ? '!' : ''}[:#{mdef.argument.join(',:')}].include?(@#{@attr_name}); end")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'active_record/connection_adapters/abstract/schema_definitions'
|
2
|
+
|
3
|
+
if defined?(ActiveRecord)
|
4
|
+
module ActiveRecord
|
5
|
+
module ConnectionAdapters
|
6
|
+
class TableDefinition
|
7
|
+
def column_with_enumerated_attribute(name, type, options = {})
|
8
|
+
type = 'string' if type.to_s == 'enum'
|
9
|
+
column_without_enumerated_attribute(name, type, options)
|
10
|
+
end
|
11
|
+
safe_alias_method_chain :column, :enumerated_attribute
|
12
|
+
|
13
|
+
def enum(*args)
|
14
|
+
options = args.extract_options!
|
15
|
+
column_names = args
|
16
|
+
column_names.each { |name| column(name, 'string', options) }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
#ARGV is used by generators -- if it contains one of these generator commands - add enumeration support
|
24
|
+
#unless ((ARGV || []) & ["scaffold", "rspec_scaffold", "nifty_scaffold"]).empty?
|
25
|
+
if ((ARGV || []).any?{|o| o =~ /scaffold/ })
|
26
|
+
begin
|
27
|
+
require 'rails/generators'
|
28
|
+
require 'rails/generators/generated_attribute'
|
29
|
+
rescue
|
30
|
+
rescue Exception => ex
|
31
|
+
end
|
32
|
+
|
33
|
+
module Rails
|
34
|
+
module Generators
|
35
|
+
class GeneratedAttribute
|
36
|
+
def field_type_with_enumerated_attribute
|
37
|
+
return (@field_type = :enum_select) if type == :enum
|
38
|
+
field_type_without_enumerated_attribute
|
39
|
+
end
|
40
|
+
alias_method_chain :field_type, :enumerated_attribute
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if defined?(ActionView::Base)
|
47
|
+
module ActionView
|
48
|
+
module Helpers
|
49
|
+
|
50
|
+
#form_options_helper.rb
|
51
|
+
module FormOptionsHelper
|
52
|
+
#def select
|
53
|
+
def enum_select(object, method, options={}, html_options={})
|
54
|
+
InstanceTag.new(object, method, self, options.delete(:object)).to_enum_select_tag(options, html_options)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class InstanceTag
|
59
|
+
def to_enum_select_tag(options, html_options={})
|
60
|
+
choices = []
|
61
|
+
if self.object.respond_to?(:enums)
|
62
|
+
enums = self.object.enums(method_name.to_sym)
|
63
|
+
choices = enums ? enums.select_options : []
|
64
|
+
if (value = self.object.__send__(method_name.to_sym))
|
65
|
+
options[:selected] ||= value.to_s
|
66
|
+
else
|
67
|
+
options[:include_blank] = enums.allows_nil? if options[:include_blank].nil?
|
68
|
+
end
|
69
|
+
end
|
70
|
+
to_select_tag(choices, options, html_options)
|
71
|
+
end
|
72
|
+
|
73
|
+
#initialize record_name, method, self
|
74
|
+
if respond_to?(:to_tag)
|
75
|
+
def to_tag_with_enumerated_attribute(options={})
|
76
|
+
#look for an enum
|
77
|
+
if (column_type == :string &&
|
78
|
+
self.object.class.respond_to?(:has_enumerated_attribute?) &&
|
79
|
+
self.object.class.has_enumerated_attribute?(method_name.to_sym))
|
80
|
+
to_enum_select_tag(options)
|
81
|
+
else
|
82
|
+
to_tag_without_enumerated_attribute(options)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
alias_method_chain :to_tag, :enumerated_attribute
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class FormBuilder
|
90
|
+
def enum_select(method, options={}, html_options={})
|
91
|
+
@template.enum_select(@object_name, method, objectify_options(options), @default_options.merge(html_options))
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
@@ -0,0 +1,384 @@
|
|
1
|
+
require 'test_in_memory'
|
2
|
+
require 'active_record'
|
3
|
+
require 'enumerated_attribute'
|
4
|
+
require 'race_car'
|
5
|
+
|
6
|
+
describe "RaceCar" do
|
7
|
+
|
8
|
+
it "should have default labels for :gear attribute" do
|
9
|
+
labels_hash = {:reverse=>'Reverse', :neutral=>'Neutral', :first=>'First', :second=>'Second', :over_drive=>'Over drive'}
|
10
|
+
labels = ['Reverse', 'Neutral', 'First', 'Second', 'Over drive']
|
11
|
+
select_options = [['Reverse', 'reverse'], ['Neutral', 'neutral'], ['First', 'first'], ['Second', 'second'], ['Over drive', 'over_drive']]
|
12
|
+
r=RaceCar.new
|
13
|
+
r.gears.labels.should == labels
|
14
|
+
labels_hash.each do |k,v|
|
15
|
+
r.gears.label(k).should == v
|
16
|
+
end
|
17
|
+
r.gears.hash.should == labels_hash
|
18
|
+
r.gears.select_options.should == select_options
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should retrieve :gear enums through enums method" do
|
22
|
+
r=RaceCar.new
|
23
|
+
r.enums(:gear).should == r.gears
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return a Symbol type from reader methods" do
|
27
|
+
r=RaceCar.new
|
28
|
+
r.gear.should be_an_instance_of(Symbol)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should increment and decrement :gear attribute correctly" do
|
32
|
+
r=RaceCar.new
|
33
|
+
r.gear = :neutral
|
34
|
+
r.gear_next.should == :first
|
35
|
+
r.gear_next.should == :second
|
36
|
+
r.gear_next.should == :over_drive
|
37
|
+
r.gear_next.should == :reverse
|
38
|
+
r.gear_next.should == :neutral
|
39
|
+
r.gear.should == :neutral
|
40
|
+
r.gear_previous.should == :reverse
|
41
|
+
r.gear_previous.should == :over_drive
|
42
|
+
r.gear_previous.should == :second
|
43
|
+
r.gear_previous
|
44
|
+
r.gear.should == :first
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should have dynamic predicate methods for :gear attribute" do
|
48
|
+
r=RaceCar.new
|
49
|
+
r.gear = :second
|
50
|
+
r.gear_is_in_second?.should be_true
|
51
|
+
r.gear_not_in_second?.should be_false
|
52
|
+
r.gear_is_nil?.should be_false
|
53
|
+
r.gear_is_not_nil?.should be_true
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should have working dynamic predicate methods on retrieved objects" do
|
57
|
+
r=RaceCar.new
|
58
|
+
r.gear = :second
|
59
|
+
r.save!
|
60
|
+
|
61
|
+
s=RaceCar.find r.id
|
62
|
+
s.should_not be_nil
|
63
|
+
s.gear_is_in_second?.should be_true
|
64
|
+
s.gear_is_not_in_second?.should be_false
|
65
|
+
s.gear_is_nil?.should be_false
|
66
|
+
s.gear_is_not_nil?.should be_true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should be created and found with dynamic find or creator method" do
|
70
|
+
s = RaceCar.find_or_create_by_name_and_gear('specialty', :second)
|
71
|
+
s.should_not be_nil
|
72
|
+
s.gear.should == :second
|
73
|
+
s.name.should == 'specialty'
|
74
|
+
|
75
|
+
s0 = RaceCar.find_or_create_by_name_and_gear('specialty', :second)
|
76
|
+
s0.gear.should == :second
|
77
|
+
s0.id.should == s.id
|
78
|
+
end
|
79
|
+
it "should be initialized with dynamic find or initialize method" do
|
80
|
+
s = RaceCar.find_or_initialize_by_name_and_gear('myspecialty', :second)
|
81
|
+
s.should_not be_nil
|
82
|
+
s.gear.should == :second
|
83
|
+
s.name.should == 'myspecialty'
|
84
|
+
lambda { s.save! }.should_not raise_exception
|
85
|
+
|
86
|
+
s0 = RaceCar.find_or_initialize_by_name_and_gear('myspecialty', :second)
|
87
|
+
s0.gear.should == :second
|
88
|
+
s0.id.should == s.id
|
89
|
+
end
|
90
|
+
it "should find record using dynamic finder by enumerated column :gear attributes" do
|
91
|
+
r=RaceCar.new
|
92
|
+
r.gear = :second
|
93
|
+
r.name = 'special'
|
94
|
+
r.save!
|
95
|
+
|
96
|
+
s=RaceCar.find_by_gear_and_name(:second, 'special')
|
97
|
+
s.should_not be_nil
|
98
|
+
s.id.should == r.id
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should initialize according to enumerated attribute definitions" do
|
102
|
+
r = RaceCar.new
|
103
|
+
r.gear.should == :neutral
|
104
|
+
r.choke.should == :none
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should create new instance using block" do
|
108
|
+
r = RaceCar.new do |r|
|
109
|
+
r.gear = :first
|
110
|
+
r.choke = :medium
|
111
|
+
r.lights = 'on'
|
112
|
+
end
|
113
|
+
r.gear.should == :first
|
114
|
+
r.lights.should == 'on'
|
115
|
+
r.choke.should == :medium
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should initialize using parameter hash with symbol keys" do
|
119
|
+
r=RaceCar.new(:name=>'FastFurious', :gear=>:second, :lights=>'on', :choke=>:medium)
|
120
|
+
r.gear.should == :second
|
121
|
+
r.lights.should == 'on'
|
122
|
+
r.choke.should == :medium
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should initialize using parameter hash with string keys" do
|
126
|
+
r=RaceCar.new({'name'=>'FastFurious', 'gear'=>'second', 'lights'=>'on', 'choke'=>'medium'})
|
127
|
+
r.gear.should == :second
|
128
|
+
r.lights.should == 'on'
|
129
|
+
r.choke.should == :medium
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
it "should convert non-column enumerated attributes from string to symbols" do
|
134
|
+
r=RaceCar.new
|
135
|
+
r.choke = 'medium'
|
136
|
+
r.choke.should == :medium
|
137
|
+
r.save!
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should convert enumerated column attributes from string to symbols" do
|
141
|
+
r=RaceCar.new
|
142
|
+
r.gear = 'second'
|
143
|
+
r.gear.should == :second
|
144
|
+
r.save!
|
145
|
+
|
146
|
+
s=RaceCar.find r.id
|
147
|
+
s.gear.should == :second
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should not convert non-enumerated column attributes from string to symbols" do
|
151
|
+
r=RaceCar.new
|
152
|
+
r.lights = 'off'
|
153
|
+
r.lights.should == 'off'
|
154
|
+
r.save!
|
155
|
+
|
156
|
+
s=RaceCar.find r.id
|
157
|
+
s.lights.should == 'off'
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should raise InvalidEnumeration when parametrically initialized with :gear=>:drive" do
|
161
|
+
r=RaceCar.new
|
162
|
+
lambda{ r.gear= :drive}.should raise_error(EnumeratedAttribute::InvalidEnumeration)
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should raise InvalidEnumeration when parametrically initialized with :choke=>:all" do
|
166
|
+
r=RaceCar.new
|
167
|
+
lambda{ r.choke= :all}.should raise_error(EnumeratedAttribute::InvalidEnumeration)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should return non-column enumerated attributes from [] method" do
|
171
|
+
r = RaceCar.new
|
172
|
+
r[:choke].should == :none
|
173
|
+
end
|
174
|
+
|
175
|
+
it "should return enumerated column attributes from [] method" do
|
176
|
+
r=RaceCar.new
|
177
|
+
r.gear = :neutral
|
178
|
+
r[:gear].should == :neutral
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should set non-column enumerated attributes with []= method" do
|
182
|
+
r=RaceCar.new
|
183
|
+
r[:choke] = :medium
|
184
|
+
r.choke.should == :medium
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should set enumerated column attriubtes with []= method" do
|
188
|
+
r=RaceCar.new
|
189
|
+
r[:gear] = :second
|
190
|
+
r.gear.should == :second
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should raise InvalidEnumeration when setting enumerated column attribute with []= method" do
|
194
|
+
r=RaceCar.new
|
195
|
+
lambda{ r[:gear]= :drive }.should raise_error(EnumeratedAttribute::InvalidEnumeration)
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should set and retrieve string for non-enumerated column attributes with []=" do
|
199
|
+
r=RaceCar.new
|
200
|
+
r[:lights] = 'on'
|
201
|
+
r.lights.should == 'on'
|
202
|
+
r[:lights].should == 'on'
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should set and retrieve symbol for non-enumerated column attributes with []=" do
|
206
|
+
r=RaceCar.new
|
207
|
+
r[:lights] = :on
|
208
|
+
r.lights.should == :on
|
209
|
+
r[:lights].should == :on
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should raise InvalidEnumeration for invalid enum passed to attributes=" do
|
213
|
+
r=RaceCar.new
|
214
|
+
lambda { r.attributes = {:lights=>'off', :gear =>:drive} }.should raise_error(EnumeratedAttribute::InvalidEnumeration)
|
215
|
+
end
|
216
|
+
|
217
|
+
=begin
|
218
|
+
#do not write symbols to enumerated column attributes using write_attribute
|
219
|
+
#do not user read_attribute to read an enumerated column attribute
|
220
|
+
it "should write enumeration with write_attribute" do
|
221
|
+
r=RaceCar.new
|
222
|
+
r.write_attribute(:gear, :first)
|
223
|
+
r.gear.should == :first
|
224
|
+
r.save!
|
225
|
+
|
226
|
+
s=RaceCar.find r.id
|
227
|
+
s.gear.should == :first
|
228
|
+
s.write_attribute(:gear, :second)
|
229
|
+
s.save!
|
230
|
+
|
231
|
+
t=RaceCar.find s.id
|
232
|
+
t.gear.should == :second
|
233
|
+
end
|
234
|
+
|
235
|
+
it "should raise error when setting enumerated column attribute to invalid enum using write_attribute" do
|
236
|
+
r=RaceCar.new
|
237
|
+
lambda { r.write_attribute(:gear, :yo) }.should raise_error
|
238
|
+
end
|
239
|
+
=end
|
240
|
+
|
241
|
+
it "should retrieve symbols for enumerations from ActiveRecord :attributes method" do
|
242
|
+
r=RaceCar.new
|
243
|
+
r.gear = :second
|
244
|
+
r.choke = :medium
|
245
|
+
r.lights = 'on'
|
246
|
+
r.save!
|
247
|
+
|
248
|
+
s = RaceCar.find(r.id)
|
249
|
+
s.attributes['gear'].should == :second
|
250
|
+
s.attributes['lights'].should == 'on'
|
251
|
+
end
|
252
|
+
|
253
|
+
it "should update_attribute for enumerated column attribute" do
|
254
|
+
r=RaceCar.new
|
255
|
+
r.gear = :first
|
256
|
+
r.save!
|
257
|
+
r.update_attribute(:gear, :second)
|
258
|
+
r.gear.should == :second
|
259
|
+
|
260
|
+
s=RaceCar.find r.id
|
261
|
+
s.gear.should == :second
|
262
|
+
end
|
263
|
+
|
264
|
+
it "should update_attribute for non-enumerated column attribute" do
|
265
|
+
r=RaceCar.new
|
266
|
+
r.lights = 'on'
|
267
|
+
r.save!
|
268
|
+
r.update_attribute(:lights, 'off')
|
269
|
+
r.lights.should == 'off'
|
270
|
+
|
271
|
+
s=RaceCar.find r.id
|
272
|
+
s.lights.should == 'off'
|
273
|
+
end
|
274
|
+
|
275
|
+
it "should update_attributes for both non- and enumerated column attributes" do
|
276
|
+
r=RaceCar.new
|
277
|
+
r.gear = :first
|
278
|
+
r.lights = 'off'
|
279
|
+
r.save!
|
280
|
+
r.update_attributes({:gear=>:second, :lights=>'on'})
|
281
|
+
s=RaceCar.find r.id
|
282
|
+
s.gear.should == :second
|
283
|
+
s.lights.should == 'on'
|
284
|
+
s.update_attributes({:gear=>'over_drive', :lights=>'off'})
|
285
|
+
t=RaceCar.find s.id
|
286
|
+
t.gear.should == :over_drive
|
287
|
+
t.lights.should == 'off'
|
288
|
+
end
|
289
|
+
|
290
|
+
it "should provide symbol values for enumerated column attributes from the :attributes method" do
|
291
|
+
r=RaceCar.new
|
292
|
+
r.lights = 'on'
|
293
|
+
r.save!
|
294
|
+
|
295
|
+
s=RaceCar.find r.id
|
296
|
+
s.attributes['gear'].should == :neutral
|
297
|
+
end
|
298
|
+
|
299
|
+
it "should provide normal values for non-enumerated column attributes from the :attributes method" do
|
300
|
+
r=RaceCar.new
|
301
|
+
r.lights = 'on'
|
302
|
+
r.save!
|
303
|
+
|
304
|
+
s=RaceCar.find r.id
|
305
|
+
s.attributes['lights'].should == 'on'
|
306
|
+
end
|
307
|
+
|
308
|
+
it "should raise InvalidEnumeration when setting invalid enumertion value with :attributes= method" do
|
309
|
+
r=RaceCar.new
|
310
|
+
lambda { r.attributes = {:gear=>:yo, :lights=>'on'} }.should raise_error(EnumeratedAttribute::InvalidEnumeration)
|
311
|
+
end
|
312
|
+
|
313
|
+
it "should not set init value for enumerated column attribute saved as nil" do
|
314
|
+
r=RaceCar.new
|
315
|
+
r.gear = nil
|
316
|
+
r.lights = 'on'
|
317
|
+
r.save!
|
318
|
+
|
319
|
+
s=RaceCar.find r.id
|
320
|
+
s.gear.should == nil
|
321
|
+
s.lights.should == 'on'
|
322
|
+
end
|
323
|
+
|
324
|
+
it "should not set init value for enumerated column attributes saved as value" do
|
325
|
+
r=RaceCar.new
|
326
|
+
r.gear = :second
|
327
|
+
r.lights = 'all'
|
328
|
+
r.save!
|
329
|
+
|
330
|
+
s=RaceCar.find r.id
|
331
|
+
s.gear.should == :second
|
332
|
+
s.lights.should == 'all'
|
333
|
+
end
|
334
|
+
|
335
|
+
it "should save and retrieve its name" do
|
336
|
+
r = RaceCar.new
|
337
|
+
r.name= 'Green Meanie'
|
338
|
+
r.save!
|
339
|
+
|
340
|
+
s = RaceCar.find r.id
|
341
|
+
s.should_not be_nil
|
342
|
+
s.name.should == 'Green Meanie'
|
343
|
+
end
|
344
|
+
|
345
|
+
it "should save and retrieve symbols for enumerated column attribute" do
|
346
|
+
r = RaceCar.new
|
347
|
+
r.gear = :over_drive
|
348
|
+
r.save!
|
349
|
+
|
350
|
+
s = RaceCar.find r.id
|
351
|
+
#s.should_not be_nil
|
352
|
+
s.gear.should == :over_drive
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should not save values for non-column enumerated attributes" do
|
356
|
+
r=RaceCar.new
|
357
|
+
r.choke = :medium
|
358
|
+
r.save!
|
359
|
+
|
360
|
+
s=RaceCar.find r.id
|
361
|
+
s.choke.should == :none
|
362
|
+
end
|
363
|
+
|
364
|
+
it "should save string and retrieve string for non-enumerated column attributes" do
|
365
|
+
r =RaceCar.new
|
366
|
+
r.lights = 'on'
|
367
|
+
r.save!
|
368
|
+
|
369
|
+
s = RaceCar.find r.id
|
370
|
+
s.lights.should == 'on'
|
371
|
+
s[:lights].should == 'on'
|
372
|
+
end
|
373
|
+
|
374
|
+
it "should save symbol and retrieve string for non-enumerated column attributes" do
|
375
|
+
r =RaceCar.new
|
376
|
+
r.lights = :off
|
377
|
+
r.save!
|
378
|
+
|
379
|
+
s = RaceCar.find r.id
|
380
|
+
s.lights.should == "--- :off\n"
|
381
|
+
s[:lights].should == "--- :off\n"
|
382
|
+
end
|
383
|
+
|
384
|
+
end
|