edave-enumerated_attribute 0.2.18
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/.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
|